我正在接受一门Java考试的培训,并且我遇到了一些我在去年的主题中不了解的内容。这里是代码Java“诡计”,重新定义了女儿班的成员
class Mother {
int var = 2;
int getVar() {
return var;
}
}
class Daughter extends Mother {
int var = 1;
int getVar() {
return var;
}
public static void main(String[] args) {
Mother m = new Mother();
System.out.println(m.var);
System.out.println(m.getVar());
m = new Daughter();
System.out.println(m.var);
System.out.println(m.getVar());
}
}
问题是“这个程序的输出是什么?”。我会去与2 2 1 1,但编译和运行这段代码时,我得到2 2 2 1.
任何人都可以解释我为什么?
感谢您的阅读!
'女儿'延伸'母亲'?这很奇怪,因为实际上它是相反的。 – mbx 2011-05-15 12:57:49
我也有兴趣听到原因。我在Eclipse中运行它,并用调试器检查了值,调试器实际上在m = new Daugher()-line后面显示了具有两个不同var成员的本地m变量。 m.var似乎解析为母亲中的一个(也许是因为局部变量被声明为Mother,不知道?),并且m.getVar()调用Daughter中的getVar(如预期的那样)。 – esaj 2011-05-15 12:58:21
请注意,在真正的程序中,这不会发生,因为通常你会使'var'变成私人的。如果你想让课堂以外的课程可以访问,这应该是非常罕见的,那么你应该确保变量不会互相隐藏。 – starblue 2011-05-15 14:26:52