我无法理解下面的输出。
我不知道为什么输出是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
的i
背后B
的i
,和你正在使用的参考对象A
,所以你得到它的领域。如果你这样做B b = new B()
,你会看到20
,符合市场预期。
如果你希望真正覆盖,尝试使用方法。
class A {
public int get() {
return 10;
}
}
class B extends A {
@Override
public int get() {
return 20;
}
}
看到
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);
}
}
和
A a = new B();
System.out.print(a); // super: 10; this: 20
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句