java學(xué)習(xí)筆記 動態(tài)綁定實現(xiàn)多態(tài)

在《java編程思想》這本書的多態(tài)的那一章中提到多態(tài)是通過動態(tài)綁定實現(xiàn)的济瓢,但具體的實現(xiàn)過程作者沒有詳細(xì)介紹。本文試圖弄清楚Java 動態(tài)綁定的實現(xiàn)原理妹卿。

本文的邏輯:什么是綁定旺矾?為什么需要綁定?綁定的分類夺克?為什么要有兩種綁定類型箕宙?每種類型的綁定分別是如何實現(xiàn)的?這種思想給了我們什么啟發(fā)铺纽?

1.綁定

面向?qū)ο蟮恼Z言中柬帕,最常見不過的就是調(diào)用實例化對象的方法,而綁定就是將方法和所在對象/類關(guān)聯(lián)起來狡门。例如陷寝,Shape s=new Shape();s.draw(); 通過綁定,當(dāng)調(diào)用draw()方法時其馏,系統(tǒng)會調(diào)用s對象的draw()方法凤跑,而不是其他對象的同名方法。至于為什么要綁定叛复,看例子也明白了仔引,通過綁定扔仓,可以方法找到自己的主人,即作用的對象咖耘。

2翘簇。綁定的分類

綁定分為靜態(tài)綁定(運行前綁定)和動態(tài)綁定(運行時綁定)。

靜態(tài)綁定:在程序運行前就明確了方法屬于哪個類鲤看,所以編譯的時候就可以找到類缘揪,進(jìn)而找到它的方法進(jìn)行編譯。

動態(tài)綁定:在程序運行中义桂,要根據(jù)實例對象的類型確定調(diào)用哪個方法找筝。

有了靜態(tài)綁定為什么還要有動態(tài)綁定?因為程序員想讓代碼的擴(kuò)展性更好(說人話:少寫點代碼慷吊,少改點bug)袖裕,所以通過實現(xiàn)動態(tài)綁定實現(xiàn)多態(tài),下面介紹動態(tài)綁定這個黑盒子中的世界溉瓶。

3. 動態(tài)綁定的實現(xiàn)

答案是:方法表急鳄。方法表這里涉及到JVM(java虛擬機(jī))加載類的具體過程,下面會安排專門的文章進(jìn)行探索堰酿,也是很有意思疾宏。不知道什么東西的可以先把它想象成一個簡單的多行兩列的表格,每一行左邊存著類的某個方法触创,右邊存的是該方法的指針(指向該方法的內(nèi)存地址坎藐,即內(nèi)存中該方法代碼塊的起始位置)。

那么想象一下多態(tài)的名場面哼绑,當(dāng)三角形類(Tri)岩馍、圓形類(Cir)繼承Shape類時,分別重寫了draw()方法抖韩。當(dāng)

Shape s1=new Tri(); s1.draw(); 被運行時蛀恩,機(jī)器準(zhǔn)確無誤地調(diào)用了三角形的draw方法。那么方法表具體是怎么做的呢茂浮?

編譯時双谆,編譯器會加載類的方法表到該類的方法區(qū)中,如果被編譯的程序中某個類的方法是在它的方法表中存在席揽,編譯就能通過佃乘。例如編譯器在編譯程序Tri t1=new Tri(); t1.erase(); 時,如果在Tri類的方法表中找到erase方法驹尼,則編譯就會通過趣避。

如果子類Tri重寫父類中的draw方法時,Tri中的方法表中的draw方法會指向它自己的draw方法的代碼塊地址新翎。

回到上文多態(tài)的名場面程帕,運行時住练,在執(zhí)行Shape s1=new Tri()時,會創(chuàng)建一個三角形對象愁拭,然后運行 s1.draw();時讲逛,JVM會把s1對象壓入操作棧,對其進(jìn)行操作岭埠。具體是找到s1對象所屬的三角形類去找draw方法盏混,找到之后進(jìn)行調(diào)用,所以調(diào)用的是三角形的draw方法惜论。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末许赃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子馆类,更是在濱河造成了極大的恐慌混聊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乾巧,死亡現(xiàn)場離奇詭異句喜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沟于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門咳胃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旷太,你說我怎么就攤上這事展懈。” “怎么了泳秀?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵标沪,是天一觀的道長榄攀。 經(jīng)常有香客問我嗜傅,道長,這世上最難降的妖魔是什么檩赢? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任吕嘀,我火速辦了婚禮,結(jié)果婚禮上贞瞒,老公的妹妹穿的比我還像新娘偶房。我一直安慰自己,他們只是感情好军浆,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布棕洋。 她就那樣靜靜地躺著,像睡著了一般乒融。 火紅的嫁衣襯著肌膚如雪锈麸。 梳的紋絲不亂的頭發(fā)上逞带,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天秸谢,我揣著相機(jī)與錄音,去河邊找鬼奢驯。 笑死,一個胖子當(dāng)著我的面吹牛次绘,可吹牛的內(nèi)容都是我干的瘪阁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼邮偎,長吁一口氣:“原來是場噩夢啊……” “哼管跺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钢猛,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤伙菜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后命迈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贩绕,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年壶愤,在試婚紗的時候發(fā)現(xiàn)自己被綠了淑倾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡征椒,死狀恐怖娇哆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勃救,我是刑警寧澤碍讨,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蒙秒,受9級特大地震影響勃黍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晕讲,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一覆获、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓢省,春花似錦弄息、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春缨称,著一層夾襖步出監(jiān)牢的瞬間废亭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工具钥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留豆村,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓骂删,卻偏偏與公主長得像掌动,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宁玫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容