0

我有两个类(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

为什么?

4

1 回答 1

2

来自官方文档

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

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

相关问题:Java 继承中的隐藏字段

于 2014-02-26T21:21:19.573 回答