【发布时间】:2014-05-28 03:11:53
【问题描述】:
在下面的代码sn-p中,结果真的很混乱。
public class TestInheritance {
public static void main(String[] args) {
new Son();
/*
Father father = new Son();
System.out.println(father); //[1]I know the result is "I'm Son" here
*/
}
}
class Father {
public String x = "Father";
@Override
public String toString() {
return "I'm Father";
}
public Father() {
System.out.println(this);//[2]It is called in Father constructor
System.out.println(this.x);
}
}
class Son extends Father {
public String x = "Son";
@Override
public String toString() {
return "I'm Son";
}
}
结果是
I'm Son
Father
为什么“this”在Father构造函数中指向Son,而“this.x”在Father中指向“x”字段。 “this”关键字是如何工作的?
我知道多态的概念,但是[1]和[2]之间不会有区别吗?当 new Son() 被触发时,内存中发生了什么?
【问题讨论】:
-
您不能覆盖字段。如果你尝试,就会发生奇怪的事情。
-
这种情况说明了为什么像 TIOBE 这样的措施完全没有意义。这种愚蠢、简单和基本的(在互联网上被问了多次,包括 SO)在两分钟内收到 10 个赞成票,而我简单的三行答案在五分钟内收到 6 个赞成票。用这种流量来衡量一种语言的流行度是完全没有意义的,因为流量的质量表明了这一点。
-
我敢肯定,如果我用 C++ 而不是 Java 发布完全相同的问题,我会在几分钟内收到大量反对票和数千个重复标记。
-
@Nick 如果您是新手,这个问题本身就是一个完全合理的问题。我的意思是 SO 被设计成一个知识库,有很好的问题和很好的答案。因此,有些问题有很多赞成票,反映了该主题的重要性。但这是一个关于多态性的基本问题,这个问题之前已经在互联网上直接或间接地回答过很多次,尤其是 SO。
-
@Nick 我对这类基本问题的期望是人们提供指向其他参考资料的链接(在 SO 内部,即重复项),以免在 SO 网络上重复知识,而不是对问题进行大规模投票。正如我所说,如果我发布问题,我确信 C++ 人员会这样做。
标签: java inheritance polymorphism this