java方法調用-動態(tài)分派

前一篇文章聊了一下方法調用中的靜態(tài)分派颠猴,這次我們聊下動態(tài)分派的過程砸喻,他和多態(tài)的另外一個重要體現(xiàn)-重寫(override)有著很密切的關聯(lián)若未。先看下如下代碼:


運行結果:
man say hello

woman say hello

woman say hello

這個運行結果對于習慣了面向對象思維的java程序員來說相對比較簡單辐真。但是虛擬機是如何知道要調用哪個方法呢糕珊?

顯然不能根據(jù)靜態(tài)類型來決定磷斧,因為金泰類型同樣都是human的兩個變量man和woman在調用sayHello()方法時執(zhí)行了不同的行為振愿,并且變量man在兩次調用中執(zhí)行了不同的方法。導致這個現(xiàn)象的原因很明顯弛饭,是這兩個變量的實際類型不同冕末,Java虛擬機是如何根據(jù)實際類型來分派方法執(zhí)行版本呢,我們通過javap命令輸出這段代碼的字節(jié)碼侣颂,參見下圖:


0-15行的字節(jié)碼是準備動作栓霜,作用是建立man和woman的內存空間、調用Man和Woman類的實例構造器横蜒,將這兩個實例的引用存放在第1胳蛮、2個局部變量表Slot之中,這個動作也對應代碼中的這兩句:
Human man = new Man();

Human woman = new Woman();

接下來16-21句是關鍵部分丛晌,16仅炊、20分別把剛剛建立的兩個對象的引用壓倒棧頂,這兩個對象時將要執(zhí)行sayHello()方法的所有者澎蛛,稱為接收者抚垄;17和21句是方法的調用指令,這兩條調用指令從字節(jié)碼角度來看谋逻,無論指令還是參數(shù)完全一樣呆馁,但是這兩句指令最終執(zhí)行的目標方法并不相同。原因就需要從invokevirtual指令的多態(tài)查找過程開始說起毁兆,invokevirtual指令的運行時解析過程大致分為以下幾個步驟:

1浙滤、找到操作數(shù)棧頂?shù)牡谝粋€元素所指向的對象實際類型,記做C气堕。

2纺腊、如果在類型C中找到與常量中的描述符合簡單名稱都相符的方法,則進行訪問權限校驗茎芭,如果通過則返回這個方法的直接引用揖膜,查找過程結束;如果不通過梅桩,則返回java.lang.IllegalAccessError異常壹粟。

3、否則宿百,按照繼承關系從下往上依次對C的各個父類進行第2步的搜索和驗證操作趁仙。

4洪添、如果始終沒有找到合適的方法,則拋出java.lang.AbstractMethodError異常

由于invokevirtual指令執(zhí)行的第一步就是在運行期確定接收者的實際類型幸撕,所以兩次調用中invokevirtual指令吧常量池中的類方法符號引用解析到了不同的直接引用上,這個過程就是java語言中方法重寫的本質外臂。我們把這種在運行期根據(jù)實際類型確定方法執(zhí)行版本的分派過程稱為動態(tài)分派坐儿。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宋光,隨后出現(xiàn)的幾起案子貌矿,更是在濱河造成了極大的恐慌,老刑警劉巖罪佳,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逛漫,死亡現(xiàn)場離奇詭異,居然都是意外死亡赘艳,警方通過查閱死者的電腦和手機酌毡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕾管,“玉大人枷踏,你說我怎么就攤上這事£” “怎么了旭蠕?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旷坦。 經常有香客問我掏熬,道長,這世上最難降的妖魔是什么秒梅? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任旗芬,我火速辦了婚禮,結果婚禮上捆蜀,老公的妹妹穿的比我還像新娘岗屏。我一直安慰自己,他們只是感情好漱办,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布这刷。 她就那樣靜靜地躺著,像睡著了一般娩井。 火紅的嫁衣襯著肌膚如雪暇屋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天洞辣,我揣著相機與錄音咐刨,去河邊找鬼昙衅。 笑死,一個胖子當著我的面吹牛定鸟,可吹牛的內容都是我干的而涉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼联予,長吁一口氣:“原來是場噩夢啊……” “哼啼县!你這毒婦竟也來了?” 一聲冷哼從身側響起沸久,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤季眷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卷胯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體子刮,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年窑睁,在試婚紗的時候發(fā)現(xiàn)自己被綠了挺峡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡担钮,死狀恐怖沙郭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情裳朋,我是刑警寧澤病线,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鲤嫡,受9級特大地震影響送挑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜暖眼,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一惕耕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诫肠,春花似錦司澎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丧鸯,卻和暖如春蛤铜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工围肥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剿干,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓穆刻,卻偏偏與公主長得像置尔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氢伟,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容