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

时间:2019-03-27 14:44:05

标签: 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");
    }
}

和从其继承的另一个类

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

请注意,method()的{​​{1}}只是B的{​​{1}}的包装。

当我运行以下代码时

method()

我得到A作为输出,这意味着B b = new B(); b.method(); Object B , A attribute访问了不同的事物。为什么会这样呢?

this是否应该引用类this.attr的{​​{1}}方法?

1 个答案:

答案 0 :(得分:14)

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

通过调用super.method(),打印this会导致调用toString方法,该方法实际上已被覆盖-因此,这就是您打印“对象B”的原因在B的实例上调用了方法。但是this中的this.attr实际上是指父对象,因为您是从父类中调用method(通过{{1} }。