为什么方法可以被覆盖,而属性不能?

2022-09-04 03:18:47

我有一个班级

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

请注意,of 只是 的 包装器。method()Bmethod()A

当我运行以下代码时

B b = new B();
b.method();

我得到输出,这意味着,并访问不同的东西。为什么会这样呢?Object B , A attributethisthis.attr

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


答案 1

通过声明与父类同名的方法,可以重写它,即替换原始行为。但是,如果声明具有相同名称的字段,则实际上会隐藏它,使其无法从该子类访问,但只能通过 .请参阅有关变量隐藏的 oracle 文档,以及使用关键字 super。请注意,不建议使用变量隐藏,因为它会产生您正在经历的那种混乱。super.field

通过调用 ,打印会导致调用该方法,该方法实际上已被覆盖 - 因此,这就是它打印“对象 B”的原因,因为您在 B 的实例上调用了该方法。但是 in 实际上指的是父对象,因为您正在从父类 (by ) 调用super.method()thistoStringthisthis.attrmethodsuper.method()


答案 2