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

请参阅下面的代码,其中的方法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

    }

}


慕森卡
浏览 441回答 3
3回答

慕婉清6462132

我已经修改了您的代码,以方便解释,而不是变量'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多态性,但这是用于方法的,而不是实例变量。因此,不进行类型转换就无法访问变量,除非重写(运行时多态),否则必须进行类型转换才能访问方法。因此,在我们的案例中,很明显,超类带有子类实例的引用要在超类中查看。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java