我无法理解以下输出。
我不知道为什么输出是 10,我认为该行A a = new B()
创建B类的新实例,我认为结果应该是20
class A {
int i = 10;
}
class B extends A {
int i = 20;
}
public class MainClass {
public static void main(String[] args) {
A a = new B();
System.out.println(a.i);
}
}
为什么会这样工作..请解释一下。
首先,看隐藏字段(强调已添加)
在类中,与超类中的字段同名的字段隐藏超类的字段,即使它们的类型不同
换句话说,这不是“继承”,因为你实际上是在隐藏A
's i
behind B
's i
,并且您正在使用的参考对象A
,所以你得到了它的字段。如果你这样做了B b = new B()
,你会看到20
,正如预期的那样。
如果您期望真正的覆盖,请尝试使用方法。
class A {
public int get() {
return 10;
}
}
class B extends A {
@Override
public int get() {
return 20;
}
}
See
A a = new B();
System.out.print(a.get()); // 20
如果您确实想同时查看两者,请参阅此示例。
class A {
int i = 10;
}
class B extends A {
int i = 20;
@Override
public String toString() {
return String.format("super: %d; this: %d", super.i, this.i);
}
}
And
A a = new B();
System.out.print(a); // super: 10; this: 20
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)