前言
如果類別與類別之間有繼承關係,則您可以用父類別宣告一個參考名稱,並讓其參考至子類別的物件實例,並以父類別上的公開介面來操作子類別上對應的公開方法,這是多型的基本操作方式。
一、多型的基本概念
多型是指在執行期間(而非編譯時期) 判斷物件實例所參考的實際類型,根據其實際的類型調用其相應的方法。
在之前「抽象類別與介面」篇章中,有提到 多型(polymorphism) 的基本概念。
二、應用多型
目的:解決多載的缺點
如果一個方法有100個型別要使用,我們需要寫 100 個同名的方法?!別開玩笑了!這會使得類別非常龐大且浪費編寫時間。所以物件導向使用多型來解決這個問題。
使用多型會碰到向上轉型(Upcasting)、向下轉型(Downcasting)與 instanceof 關鍵字。我們先建立三個類別,Manager 與 Engineer 繼承 Employee 類別,將使用這個繼承關係來討論多型。

▼ Employee 類別
▼ Manager 類別
▼ Engineer 類別
2.1 向上轉型(Upcasting)
當我們想要將子類別強制轉換為父類別時,我們使用 Upcasting(或 widening)。它會自動發生,不需要明確地做任何事情。


2.2 向下轉型(Downcasting)
當我們想要將父類別強制轉換為子類別時,我們使用 Downcasting(或 narrowing),而在 Java 中不能直接進行向下轉型,顯然我們必須使用小括號( )刮起想要轉換的型別,例如,(Manager) Employee;。


2.3 使用 instanceof 關鍵字
如果子類別增加一個方法,但父類別沒有;則在 showResult() 方法要實現所有類別中的方法時,會編譯錯誤。

使用 instanceof 判斷記憶體位址是屬於哪一個子類別
傳回值:boolean


三、總結
多型 是指在「執行期間」(而非編譯時期)判斷所引用的實際物件類型,根據其實際的類型調用其相應的方法。所以實際當中找到要調用的方法時是動態的去找的,new 的是誰就找誰的方法。
多型的存在有三個必要的條件:
1. 要有繼承關係
2. 要有覆寫(Override)
3. 父類別參考變數指向子類別物件實例
沒有留言:
張貼留言