在下面的代码片段中,结果确实令人困惑。

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使用动态绑定(bind)来解决该调用,即调用子版本。访问成员x时,由于成员不是多态的,因此您访问当前作用域的成员(父亲)。

关于java - Java继承中的 “this”关键字如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23055354/

10-12 02:44