为什么可以覆盖方法但不能覆盖属性?

Noa*_*hop 14 java inheritance this

我有一堂课

public class A {
    public String attr ="A attribute";
    public void method() {
        System.out.println(this+" , "+this.attr);
    }
    public String toString() {
        return("Object A");
    }
}
Run Code Online (Sandbox Code Playgroud)

还有另一个继承自它的类

public class B extends A{
    public String attr = "B attribute";
    public void method() {
        super.method();
    }
    public String toString() {
        return("Object B");
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,method()of B只是for method()的包装A。

当我运行以下代码

B b = new B();
b.method();
Run Code Online (Sandbox Code Playgroud)

我得到的意思Object B , A attribute是输出,this并this.attr访问了不同的内容。为什么会这样?

不应该System.out.println(this)参考toString()课堂方法A吗?

Ond*_* K. 13

通过声明一个与父类同名的方法,您可以覆盖它,即替换原始行为。但是,如果声明一个具有相同名称的字段,则可以有效地隐藏它,从而使该子类无法访问它,但只能通过来访问super.field。有关变量隐藏以及使用关键字super的信息,请参见oracle docs 。请注意,不建议使用变量隐藏,因为它会造成您正遇到的混乱。

通过调用super.method(),打印会this导致调用toString方法,该方法实际上已被覆盖-因此,正如您在B实例上调用该方法一样,这就是它打印“对象B”的原因。但是thisin this.attr实际上是指父对象,就像您method从父类(by super.method())调用一样。