物件導向 01 - extends

December 17, 2020

繼承(extends)

好處是減少代碼冗余、增加覆用性、便於功能的擴展、多態性。子類繼承父類後,子類會獲取父類的結構、屬性、方法,如果為 private,因為封裝性影響,子類不能直接調用父類結構,需透過 getter 和 setter 進行操作。

子類繼承之後可以聲名自己持有的屬性和方法,實現功能擴展。在 JAVA 只支持單繼承和多層繼承,無多重繼承。一個類能被多個子類繼承,一個類只能有一個父類。

所有 java 類(除 java.lang.Object)直接會間接繼承 java.lang.Object 類

覆寫 (override)

以繼承來說 B 繼承 A,只要 B 有覆寫 A 的相關方法,則建立物件時取得的是 B 的覆寫,否則就是 A 的。

super

用來調用以下

子類物件實例化過程

假設 D 繼承 C,C 繼承 B,B 繼承 A。在建立物件 D 時在堆中會將一連串的類別進行載入,就是加載父類中聲明的屬性。這過程中我們會直接或間接調用父類的建構方法,直到 Object 類為止。

多態性 (Polymorphism)

物件的多態性,父類的引用指向子類的物件,會應用於抽象類(Abstract)或介面(interface)上。在 JAVA 中引用變數有兩個類型非分別是編譯時類型運行時類型,若兩者類型不一致則會出現多態。

class Animal {
    public void a(){

    }
    public void b(){
        
    }
}

class Dog extends Animal{
    public void a(){

    }
    public void b(){
        
    }
}

class Cat extends Animal{
    public void a(){

    }
    public void b(){
        
    }
}

// 調用時

public class Test {
    public static void main(String [] args){
        Test t = new Test();
        t.fun(new Dog());
        t.fun(new Cat());
    }

    public void fun(Animal animal){
        animal.a();
        animal.b();
    }
}