我的代码是:
class Foo {
public int a=3;
public void addFive() {
a+=5;
System.out.print("f ");
}
}
class Bar extends Foo {
public int a=8;
public void addFive() {
this.a += 5;
System.out.print("b ");
}
}
public class TestClass {
public static void main(String[]args) {
Foo f = new Bar();
f.addFive();
System.out.println(f.a);
}
}
输出:
b 3
请向我解释一下,由于该方法已被覆盖,为什么此问题的输出为“b 3”而不是“b 13”?
最佳答案
您无法在Java中覆盖变量,因此实际上有两个a
变量-一个在Foo
中,一个在Bar
中。另一方面,addFive()
方法是多态的,因此它会修改Bar.a
(尽管Bar.addFive()
的静态类型为f
,但仍会调用Foo
)。
但是最后,您访问f.a
,并且在编译期间使用已知类型的f
(即Foo
)解析了此引用。因此Foo.a
从未被触及过。
Java中的BTW非最终变量应该永远不要公开。