前言
如果類別與類別之間有繼承關係,則您可以用父類別宣告一個參考名稱,並讓其參考至子類別的物件實例,並以父類別上的公開介面來操作子類別上對應的公開方法,這是多型的基本操作方式。
一、多型的基本概念
多型是指在執行期間(而非編譯時期) 判斷物件實例所參考的實際類型,根據其實際的類型調用其相應的方法。
在之前「抽象類別與介面」篇章中,有提到 多型(polymorphism) 的基本概念。
如果類別與類別之間有繼承關係,則您可以用父類別宣告一個參考名稱,並讓其參考至子類別的物件實例,並以父類別上的公開介面來操作子類別上對應的公開方法,這是多型的基本操作方式。
多型是指在執行期間(而非編譯時期) 判斷物件實例所參考的實際類型,根據其實際的類型調用其相應的方法。
在之前「抽象類別與介面」篇章中,有提到 多型(polymorphism) 的基本概念。
前一篇介紹了物件導向,類別的構造與性質,雖然知道把具體或概念一一抽象出來成為類別,碰到相似的具體或概念時,可以使用繼承來減少程式碼的撰寫,但有沒有可能您寫的父類別,繼承過來的子類別卻需要把每個方法都覆寫(Override)一次,導致父類別的方法完全無用武之地呢?
或是您可能想要繼承爸爸與媽媽的意志,爸爸是由爺爺、奶奶這個血脈傳承下來,而媽媽卻是由外公、外婆這個血脈傳承下來,那麼我要如何同時繼承兩個呢?在 JAVA 中規定不能繼承兩個類別,那怎麼辦?
既然父類別的方法無用武之地,那麼我們只宣告方法名稱而不實作當中的邏輯,這樣的方法稱之為「抽象方法」(Abstract method)。
如果一個類別中包括了抽象方法,則該類別稱之為「抽象類別」(Abstract class),抽象類別是個未定義完全的類別,所以它不能被用來生成物件,它只能被擴充,並於擴充後完成未完成的抽象方法定義。
在 Java 中要宣告抽象方法與抽象類別,使用"abstract"關鍵字。
從某種意義上來說,抽象方法就是被用來重寫的,所以在父類別宣告的抽象方法一定要在子類別裡面重寫。如果真的不想在子類別裡面重寫這個方法,那麼可以在子類別裡面把這個方法再定義為抽象方法,因為子類別覺得我去實現也不合適,應該讓繼承我的子類別去實現比較合適,因此也可以在繼承這個子類別的下一個子類別裡面重寫父類別宣告的抽象方法,這樣是可以的。