2018年11月20日 星期二

Java SE 入門教學 - 多型

更新時間:11/20/2018

前言

如果類別與類別之間有繼承關係,則您可以用父類別宣告一個參考名稱,並讓其參考至子類別的物件實例,並以父類別上的公開介面來操作子類別上對應的公開方法,這是多型的基本操作方式。


一、多型的基本概念

多型是指在執行期間(而非編譯時期) 判斷物件實例所參考的實際類型,根據其實際的類型調用其相應的方法。

在之前「抽象類別與介面」篇章中,有提到 多型(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 判斷記憶體位址是屬於哪一個子類別

語法:物件參考變數 instanceof 類別
傳回值:boolean

三、總結

多型 是指在「執行期間」(而非編譯時期)判斷所引用的實際物件類型,根據其實際的類型調用其相應的方法。所以實際當中找到要調用的方法時是動態的去找的,new 的是誰就找誰的方法。

多型的存在有三個必要的條件:

1. 要有繼承關係
2. 要有覆寫(Override)
3. 父類別參考變數指向子類別物件實例





沒有留言:

張貼留言