面試官:什么是多態(tài)呢?
豬隊友:多種形態(tài)倍试,氣體讯屈,液體,固體~
面試官:go out! now!
到底什么是多態(tài)呢县习?
官方說:
- 接口的多種不同的實現(xiàn)方式即為多態(tài)涮母。
- 多態(tài)性是允許你將父對象設(shè)置成為一個或更多的他的子對象相等的技術(shù)。
-
我們在程序中定義的引用變量所指向的具體類型和通過該引用變量的方法調(diào)用在編程的時候并不確定准颓,當處于運行期間才確定哈蝇。就是這個引用變量究竟指向哪一個實例對象棺妓,在編譯期間是不確定的攘已,只有運行期才能確定,這樣不用修改源碼就可以把變量綁定到不同的類實例上怜跑,讓程序擁有了多個運行狀態(tài)样勃,這就是多態(tài)。
說人話:
允許將子類類型的指針賦值給父類類型的指針性芬,把不同的子類對象都當作父類來看峡眶。比如你家有親屬結(jié)婚了,讓你們家派個人來參加婚禮植锉,邀請函寫的是讓你爸來辫樱,但是實際上你去了,或者你妹妹去了俊庇,這都是可以的狮暑,因為你們代表的是你爸鸡挠,但是在你們?nèi)ブ八麄円膊恢勒l會去,只知道是你們家的人搬男〖鹫梗可能是你爸爸,可能是你們家的其他人代表你爸參加缔逛。這就是多態(tài)备埃。
多態(tài)又分為 編譯時多態(tài)和運行時多態(tài)。
編譯時多態(tài):比如重載
運行時多態(tài):比如重寫
多態(tài)的實現(xiàn)機制
簡單版本:
原理也很簡單褐奴,父類或者接口定義的引用變量可以指向子類或者具體實現(xiàn)類的實例對象按脚,由于程序調(diào)用方法是在運行期才動態(tài)綁定的,那么引用變量所指向的具體實例對象在運行期才確定敦冬。所以這個對象的方法是運行期正在內(nèi)存運行的這個對象的方法而不是引用變量的類型中定義的方法乘寒。
術(shù)語版本:
我們將引入Java靜態(tài)分派和動態(tài)分派這個概念。
- 靜態(tài)分派:所有依賴靜態(tài)類型來定位方法執(zhí)行版本的分派動作匪补。靜態(tài)分派發(fā)生在編譯階段伞辛,因此確定靜態(tài)分派的動作實際上不是由虛擬機來執(zhí)行的,而是由編譯器來完成夯缺。(編譯時多態(tài))
- 動態(tài)分派:在運行期根據(jù)實際類型確定方法執(zhí)行版本的分派動作蚤氏。(運行時多態(tài))
如果想深入的同學(xué)可以參考可以參考《深入理解Java虛擬機》。
參考:
https://blog.csdn.net/sunxianghuang/article/details/52280002