【问题标题】:Field shadowing or overriding?场阴影或覆盖?
【发布时间】:2014-02-26 21:14:45
【问题描述】:

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

为什么?

【问题讨论】:

  • 这叫做隐藏
  • 哪个隐藏,哪个覆盖?
  • 你的第一个例子,B.i 隐藏了A.i。没有覆盖字段,只有隐藏它们。
  • 字段不能被覆盖。只能覆盖非静态和非私有方法。
  • 第二种情况下没有B.i,只有A.i

标签: java overriding shadowing


【解决方案1】:

来自the official doc

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

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

相关问题:Hiding Fields in Java Inheritance

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多