为了账号安全,请及时绑定邮箱和手机立即绑定

为什么超类的实例变量没有被子类覆盖?

为什么超类的实例变量没有被子类覆盖?

慕森卡 2019-11-15 16:55:20
请参阅下面的代码,其中的方法print被覆盖,但变量a没有被覆盖。为什么允许在子类中声明重复的变量?class B {    int a = 10;    public void print() {        System.out.println("inside B superclass");    }}class C extends B {    int a = 20;    public void print() {        System.out.println("inside C subclass");    }}public class A {    public static void main(String[] args) {        B b = new C();        b.print(); // prints: inside C subclass        System.out.println(b.a); // prints superclass variable value 10    }}
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我已经修改了您的代码,以方便解释,而不是变量'a',让我们说C类包含变量'c'。出于同样的原因,为什么类C如果不进行类型转换,就无法访问类c本身的实例变量。下面给出的例子


class B

{

     int a=10;

     public void print()

     {

         System.out.println("inside B super class");

     }


}

 class C extends B

 {

     int x=20;

     public void print()

     {

         System.out.println("inside C sub class");

     }



 }

public class A  {

    public static void main(String[] args) {

        B b=new C();


        System.out.println(b.x);//will throw compile error unless b is type casted to Class C


    }


}

因此,在Java中,编译器通过引用而不是通过实例。要克服此编译器,请使用Runtime多态性,但这是用于方法的,而不是实例变量。因此,不进行类型转换就无法访问变量,除非重写(运行时多态),否则必须进行类型转换才能访问方法。


因此,在我们的案例中,很明显,超类带有子类实例的引用要在超类中查看。


查看完整回答
反对 回复 2019-11-15
  • 3 回答
  • 0 关注
  • 440 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信