为什么此代码打印超类而不是子类的值

时间:2019-01-06 10:03:34

标签: java inheritance

class A{
    int a = 10;
}

class B extends A{
    int a= 20;
}

public class C {
    public static void main(String [] args){
         A a = new B();
         System.out.println(a.a);       
        }
}

输出:10

如何根据上述代码从基类中打印值。

2 个答案:

答案 0 :(得分:3)

B已经从a继承了A。再次执行int a = 20;隐藏从a继承的A。这意味着,x.a的编译时间为x时,形式为B的表达式将求值为20。

要获得预期的行为,可以在a的构造函数中重置B

class B {
    // no need to redeclare "a" here!
    public B() { a = 20; }
} 

答案 1 :(得分:1)

当您像在此处那样在子类中创建相同名称的变量时,称为隐藏。现在,生成的子类实际上将具有这两个属性。

请参考下图,

enter image description here