多型三要素
- 繼承關係
- 方法覆寫(Override)
- 父類別參考指向子類別物件
程式碼情境分析
class Animal { void bark() { System.out.println("Animal sound"); } }
class Dog extends Animal { @Override void bark() { System.out.println("Woof"); } }
public void test1(Animal a) { a.bark(); } // I
public void test2(Object o) { o.bark(); } // II 編譯錯誤
情境 I:Animal a = new Dog(); a.bark();
- 編譯期:檢查
Animal 是否有 bark() → 有,編譯通過。
- 執行期:JVM 依物件實際型別
Dog 分派 → 呼叫 Dog.bark() → 輸出 Woof。
情境 II:Object o = new Dog(); o.bark();
- 編譯期:檢查
Object 是否有 bark() → 無,編譯失敗。
- 即使物件實際為
Dog,編譯器只看參考型別 Object。
關鍵規則總結
| 參考型別 | 物件實際型別 | 編譯檢查 | 執行分派 |
| Animal | Dog | Animal 有 bark() | Dog.bark() |
| Object | Dog | Object 無 bark() → 錯誤 | 不適用 |
| Animal | Animal | Animal 有 bark() | Animal.bark() |
多型價值
- 可擴充性:新增
Cat extends Animal 時,test1 完全不用修改。
- 可維護性:業務邏輯針對抽象介面寫入,具體實作解耦。
總結
多型核心:「編譯看左邊(參考型別),執行看右邊(物件型別)」。Object 無 bark() 導致編譯錯誤,這正是強型別語言在編譯期保護型別安全的體現。
- 上一篇文章: SOA 面向服務架構通俗理解:以淘寶開放平台為例
- 下一篇文章: C語言經典算法:約瑟夫環問題完整解析與代碼實現
Copyright ©
程式碼之家 All Rights Reserved