1、多態的定義
多態性是允許你將父對象設置成爲和它的一個或更多的子對象相等的技術,賦值後,父對象就可以根據子對象的特性以不同的方式進行運作。
簡單來說就是允許將子類類型的指針賦值給父類類型的指針,只要這樣的賦值產生了,多態也就產生了,因爲實行了“向上轉型”。
2、區別兩個概念:
覆蓋和重載
覆蓋(override):是將子類重新定義分類得虛函數的做法。與多態相關
重載(overload):是指允許存在多個同名函數,而這些函數的參數表不同(記住只能是參數表不同,可以是不同類型的參數,也可以是參數個數不同,抑或兩者都不同)。重載的實現是:編譯器根據函數的不同參數表,對同名函數進行修飾,然後這些函數就變成了不同的函數。
注意點:
(1)重載:對重載函數的調用,在編譯器間就已經確定了,是靜態的。也就是說,他們的地址在編譯期間就綁定了( 也稱早綁定)。
特徵:
* 形同的範圍(在同一個類中)
* 函數名字相同
* 參數不同
*與返回類型無關
(*virtual 關鍵字可有可無)c++中
(2)(覆蓋)多態:當子類重新定義了父類的虛函數後,父類指針根據賦給它不同的子類指針,動態地調用屬於子類的該函數,這樣的函數在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期間綁定的(也稱晚綁定)。
特徵:
* 不同的範圍(分別位於派生類和基類)
* 函數的名字相同
* 參數相同
* 返回值的類型相同
(* 基類的函數必須有virtual關鍵字)c++中
Tips:靜態方法不能被覆蓋成非靜態的方法
結論:重載只是一種語言特性,與多態無關,與面向對象無關。
“不要犯傻,如果不是晚綁定,它就不是多態”
3、多態的作用
面向對象的四個基本特徵:抽象,繼承,封裝和多態。
封裝可以隱藏實現細節,使得代碼模塊化。
繼承可以擴展已存在的代碼塊(類)。
封裝和繼承目的是爲了代碼重用。
多態的目的是爲了實現接口重用。
——筆記摘自《Java程序員面試寶典》