在下面的代码片段中,结果确实令人困惑。
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”在父亲构造函数中指向Son,而“ this.x”却指向父亲在构造函数中的“ x”字段。“ this”关键字如何运作?
我知道 多态的 概念,但是[1]和[2]之间没有区别吗?触发 新的Son() 时,内存中发生了什么?
默认情况下,所有成员函数在Java中都是多态的。这意味着当您调用this.toString()时,Java使用动态绑定来解决该调用,即调用子版本。当您访问成员x时,您将访问当前作用域的成员(父亲),因为成员不是多态的。