需要Java代码片段输出说明
我的代码是:
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",因为该方法已被覆盖?
Please explain to me, why is the output for this question "b 3" and not "b 13" since the method has been overridden?
推荐答案
你不能在 Java 中覆盖变量,因此你实际上有两个 a
变量 - 一个在 Foo
和Bar
中的一个.另一方面 addFive()
方法是多态的,因此它修改 Bar.a
(Bar.addFive()
被调用,尽管是静态类型f
是 Foo
).
You cannot override variables in Java, hence you actually have two a
variables - one in Foo
and one in Bar
. On the other hand addFive()
method is polymorphic, thus it modifies Bar.a
(Bar.addFive()
is called, despite static type of f
being Foo
).
但最终您访问 f.a
并且在编译期间使用已知类型的 f
解析此引用,即 Foo
.因此 Foo.a
从未被触及.
But in the end you access f.a
and this reference is resolved during compilation using known type of f
, which is Foo
. And therefore Foo.a
was never touched.
顺便说一句,Java 中的非最终变量应该从不公开.
BTW non-final variables in Java should never be public.
相关文章