再聊多態

2014年末,第一次去阿里面試印象很是深入,那是第一次對技術能力的打擊,開始意識到本身的問題很嚴重,作技術的卻沒有專研技術,致使技術能力遠不及本身的工做年限,其中最重要的一個問題就是多態,講講對多態的理解,我當時甚至分不清楚多態和重載重寫的關係。聊着聊着甚至都不知道什麼是多態了。java

放在今天,再來聊多態,可能又能扯出更多內容了。面試

《架構之道》上說多態無非是一種指針指向技術的應用,在c語言中就已經能夠實現,面向過程當中就已經能實現的技術,如今面向對象把這個技術規範化了,以致於到上層語言層面抽象出了語言層面的名稱,名曰多態。架構

那麼,java裏究竟又是如何來實現多態的。在jvm裏多態是怎樣實現的?這篇文章想寫明白這個事情。jvm

原本想查看查看jvm的openjdk的源碼來細說一番,折騰半天這源碼仍是挺難看的,一時半會兒怕是看不出太多門道。性能

從一篇文章裏看了看大體的流程。學習

https://bbs.pediy.com/thread-225413.htm 就是這篇。優化

基本上講述了過程,在加載類的時候,會分析加載類的全部方法,判斷是不是父類的方法的重寫,若是是將vftable的地址更新到新的重寫方法的地址,這樣調用的時候取的就是新的覆蓋過的方法了。指針

咱們來回憶一下,深刻jvm虛擬機裏講的,其實就是動態分派,分派的動做比較頻繁,因此會優化出來一個虛方法表,使用虛方法表替換元數據查找來提升性能。htm

虛方法表中存放着各個方法的實際入口地址,若是某個方法在子類中沒有被重寫,那子類的虛方法表裏面的地址入口和父類相同方法的地址入口是一致的,都指向父類的實現入口。若是子類重寫了父類的方法,子類方法表中的地址將會替換爲指向子類實現版本的入口地址。對象

這些就是多態的重寫特性的實現原理了。

留一下高手的文章,未來可能深刻學習。

相關文章
相關標籤/搜索