多態是物件導向程式設計三大特性之一(封裝、繼承、多態),它允許不同類別的物件對同一訊息做出響應。簡單來說,同一個方法呼叫可以根據傳入物件的不同而展現出不同的行為。這種「一個介面,多種實現」的特性,能有效消除類別之間的耦合關係,提高程式碼的擴展性與維護性。
想像你手機上同時更新了《大主宰》、《雪鷹領主》、《龍王傳說》等多部小說。在程式中,我們可以這樣表示:
Novel a = new TheGreatRuler(); Novel b = new SnowEagleLord(); Novel c = new DragonKingLegend();
這裡 `Novel` 是父類別,三部小說都是其子類別。我們透過父類別型別的引用指向不同的子類別實例,直到執行期才知道具體指向哪個實例,這就是多態的核心體現——向上轉型。
向上轉型讓父類別引用能指向子類別物件,既能使用父類別定義的共性方法,又能在子類別重寫方法時調用子類別的具體實現(動態綁定)。但缺點是:父類別引用無法直接呼叫子類別特有的方法(如重載方法),只能存取父類別中定義的成員。
public class Novel {
public void fun1() { System.out.println("Novel fun1"); fun2(); }
public void fun2() { System.out.println("Novel fun2"); }
}
public class TheGreatRuler extends Novel {
public void fun1(String a) { System.out.println("TheGreatRuler fun1"); fun2(); } // 重載
@Override public void fun2() { System.out.println("TheGreatRuler fun2"); } // 重寫
}
public class Test {
public static void main(String[] args) {
Novel n = new TheGreatRuler();
n.fun1(); // 輸出: Novel fun1 → TheGreatRuler fun2
}
}
public class Novel {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String drink() { return "你在看:" + getName(); }
@Override public String toString() { return null; }
}
public class TheGreatRuler extends Novel {
public TheGreatRuler() { setName("大主宰"); }
@Override public String drink() { return "你在看:" + getName(); }
@Override public String toString() { return "小說:" + getName(); }
}
// 測試
Novel[] novels = new Novel[2];
novels[0] = new TheGreatRuler();
novels[1] = new SnowEagleLord();
for (Novel n : novels) {
System.out.println(n.toString() + ":::" + n.drink());
}
// 輸出各子類別各自的實現結果
若父類別為抽象類別,子類別必須實作所有抽象方法,確保統一對外介面但內部實現各異。這是設計模式(如策略模式、模板方法模式)的基石。
所有類別隱含繼承 `Object`。當 `Object o = new TheGreatRuler(); o.toString();` 時,會沿著繼承鏈 `TheGreatRuler → Novel → Object` 尋找最末端的 `toString()` 實現並執行。
掌握多態精髓,能讓你寫出更靈活、可擴展的 Java 程式碼。下次看到「父類別引用指向子類別物件」,請記住:這不只是語法糖,更是解耦合的利器。