现场阴影或覆盖?

时间:2014-02-26 21:14:45

标签: java override shadowing

我有两个班级(A和B),B扩展A。

public class A {
   protected int i = 1;
}

public class B extends A{
   protected int i = 2;
}

在这种情况下,程序会写1。

A a = new B();
System.out.println(a.i); //1

但是如果我在构造函数中赋值i,它会写2。

public class B extends A{
   public B(){
      i=2;
   }
}

A a = new B();
System.out.println(a.i); //2

为什么?

1 个答案:

答案 0 :(得分:2)

来自the official doc

  

在类中,与超类中的字段具有相同名称的字段会隐藏超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单名称引用。相反,必须通过super访问该字段,这将在下一节中介绍。一般来说,我们不建议隐藏字段,因为它会使代码难以阅读。

字段不是多态的,您可以在A对象上保留引用。通过执行i = 2,您可以更改字段的值,从而修改结果。

相关问题:Hiding Fields in Java Inheritance