多態是物件導向三大特性(封裝、繼承、多態)中最具彈性的一項。本文從概念定義、向上轉型機制、方法重寫與多載差異、實作條件與形式(繼承/介面)全方位剖析,並附完整程式碼驗證動態綁定行為。
「同一訊息,不同物件,不同行為。」
程式碼中定義的引用型別在編譯期不確定具體指向哪個子類別實例,而是在執行期決定,從而呼叫到子類別覆寫的方法。
class Wine { void fun1() { fun2(); } void fun2() { print("Wine fun2"); } }
class JNC extends Wine {
void fun1(String a) { print("JNC fun1"); } // 多載
@Override void fun2() { print("JNC fun2"); } // 重寫
}
Wine a = new JNC(); // 向上轉型
a.fun1(); // 呼叫 Wine.fun1() → 內部呼叫 fun2() → 動態綁定到 JNC.fun2()
輸出:
Wine 的Fun.....
JNC 的Fun2...
Wine[] wines = {new JNC(), new JGJ()};
for (Wine w : wines) {
System.out.println(w.toString() + "--" + w.drink());
}
// 輸出各子類別覆寫的 drink() 與 toString()
甚至 Object o = new JGJ(); o.toString(); 也會呼叫最底層子類別的 toString()(繼承鏈最末端)。
介面定義契約,多實作類別各自實現,透過介面引用達成多態,鬆綁合更彈性。
| 類型 | 別名 | 機制 | 例子 |
|---|---|---|---|
| 編譯期 | 靜態多態 | 方法多載 | 同名不同參數列表 |
| 執行期 | 動態多態 | 動態綁定 | 重寫 + 向上轉型 |
父類別為 abstract 並宣告抽象方法 → 強制所有子類別實作 → 統一介面、多樣實作,完美支援開放封閉原則(OCP)。
多態讓程式「面向介面/父類別程式設計」,新增子類別無需修改既有邏輯,實現擴充開放、修改關閉。掌握向上轉型與動態綁定,是寫出可維護 Java 程式的關鍵。