所以我正在测试一些代码片段,以便围绕继承的概念进行测试,当我遇到这个 - 对我来说 - 奇怪的现象。
首先,我正在测试这个简单的代码:
public class Main{
public static void main(String[] args) {
Bar bar = new Bar();
System.out.println("age = " + bar.age);
bar.test();
}
}
class Foo{
int age = 2;
void test(){
System.out.println("TEST FOO");
}
}
class Bar extends Foo{
int age = 4;
void test(){
System.out.println("TEST BAR");
}
}
输出符合我的预期:
age = 4
TEST BAR
然后我对第3行做了一个小改动,在那里我将类型Bar
更改为Foo
,如下所示:
Foo bar = new Bar();
现在当我运行代码时,它给了我一个我相信很奇怪的输出:
age = 2
TEST BAR
代码bar.age
现在如何使用age
类的Foo
成员(这是有意义的),而bar.test();
仍使用Bar
类(而不是Foo,因为那是类型)?
答案 0 :(得分:22)
age
阴影中的Bar
age
中的Foo
。
此外,字段不多态(参见函数)。
因此,当您撰写Foo bar = new Bar();
时,在访问字段bar
时会使用静态类型的age
,并返回2. 在决定调用哪个bar
覆盖时使用test()
的动态类型,这是Bar
类型。
答案 1 :(得分:4)
因为您已经定义了两个不同的年龄字段,每个类别中有一个。字段不会被覆盖。