天天看點

Java執行個體屬性覆寫問題

先看一段 Python

代碼

實作效果是子類和父類共用一個

sayHello()

方法,通過覆寫屬性

name

輸出不同的屬性

class Parent():
    name = "parent"

    def getName(self):
        return self.name

    def sayHello(self):
        print(self.name, "-", self.getName())


class Child(Parent):
    name = "child"


if __name__ == "__main__":
    parent = Parent()
    print(parent.getName())
    parent.sayHello()

    child = Child()
    print(child.getName())
    child.sayHello()      

輸出效果滿足預期要求

parent
parent - parent
child
child - child      

再來看Java代碼

class Parent {
    private String name = "parent";

    public String getName() {
        return name;
    }

    public void sayHello() {
        System.out.println(name + " - " + getName());
    }
}

class Child extends Parent {
    private String name = "child";
}

public class Demo {
    public static void main(String[] args) {
        Parent parent = new Parent();

        System.out.println(parent.getName());
        parent.sayHello();

        Child child = new Child();
        System.out.println(child.getName());
        child.sayHello();
    }
}
      

輸出結果和預期不一樣

parent
parent - parent
parent
parent - parent      

修改一下子類,覆寫父類的

getName()

方法

class Parent {
    private String name = "parent";

    public String getName() {
        return name;
    }

    public void sayHello() {
        System.out.println(name + " - " + getName());
    }
}

class Child extends Parent {
    private String name = "child";

    // 增加方法覆寫
    @Override
    public String getName() {
        return name;
    }
}

public class Demo {
    public static void main(String[] args) {
        Parent parent = new Parent();

        System.out.println(parent.getName());
        parent.sayHello();

        Child child = new Child();
        System.out.println(child.getName());
        child.sayHello();
    }
}      

輸出結果看到,通過覆寫方法擷取屬性的方式可以擷取子類屬性,直接擷取的屬性還是父類中的屬性

parent
parent - parent
child
parent - child