JVM執(zhí)行方法調(diào)用1

方法的重載與重寫(xiě)

重載:同一個(gè)類中出現(xiàn)多個(gè)名字相同昌简,并且參數(shù)類型不同的方法,這些方法之間的關(guān)系侵蒙,稱之為方法重載。

小知識(shí)點(diǎn):這個(gè)限制可以通過(guò)字節(jié)碼工具繞開(kāi)傅蹂。也就是說(shuō)纷闺,在編譯完成之后,我們可以再向 class 文件中添加方法名和參數(shù)類型相同份蝴,而返回類型不同的方法犁功。當(dāng)這種包括多個(gè)方法名相同、參數(shù)類型相同婚夫,而返回類型不同的方法的類浸卦,出現(xiàn)在 Java 編譯器的用戶類路徑上時(shí),它是怎么確定需要調(diào)用哪個(gè)方法的呢案糙?當(dāng)前版本的 Java 編譯器會(huì)直接選取第一個(gè)方法名以及參數(shù)類型匹配的方法限嫌。并且靴庆,它會(huì)根據(jù)所選取方法的返回類型來(lái)決定可不可以通過(guò)編譯,以及需不需要進(jìn)行值轉(zhuǎn)換等萤皂。

重載方法的選取過(guò)程撒穷,重載方法在編譯過(guò)程中即可完成始別●晌酰可以具體到每一個(gè)方法調(diào)用端礼,Java編譯器會(huì)根據(jù)所傳入?yún)?shù)的聲明類型(注意與實(shí)際類型區(qū)分)來(lái)選取重載方法。選取過(guò)程分為三個(gè)階段:

1入录、在不考慮對(duì)基本類型自動(dòng)裝拆箱(auto-boxing蛤奥,auto-unboxing),以及可變長(zhǎng)參數(shù)的情況選取重載方法僚稿;

2凡桥、如果在第一個(gè)階段中沒(méi)有找到適配的方法,那么在允許自動(dòng)裝拆箱蚀同,但不允許可變長(zhǎng)參數(shù)的情況下選取重載方法缅刽;

3、如果在第2個(gè)階段中沒(méi)有找到適配的方法蠢络,那么在允許自動(dòng)裝拆箱以及可變長(zhǎng)參數(shù)的情況下選取重載方法衰猛。

注意:如果Java編譯器在同一個(gè)階段找到了多個(gè)適配的方法,那么它會(huì)在其中選擇一個(gè)最為貼切的刹孔,而決定貼切程度的一個(gè)關(guān)鍵就是形式參數(shù)類型的繼承關(guān)系啡省。

重寫(xiě):如果子類定義與父類中非私有方法、非靜態(tài)方法同名的方法髓霞,而且這兩個(gè)方法的參數(shù)類型相同卦睹,那么這兩個(gè)方法稱之為方法重寫(xiě)。

Java是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言方库,它的一個(gè)重要特性便是多態(tài)结序,而方法重寫(xiě),正是多態(tài)最重要的一種體現(xiàn)方式:它允許子類在繼承父類部分功能的同時(shí)纵潦,擁有自己獨(dú)特的行為笼痹。

比如,如果你經(jīng)常漫游酪穿,那么你可能知道,撥打10086會(huì)根據(jù)你當(dāng)前所在地晴裹,連接到當(dāng)?shù)氐目头患谩V貙?xiě)調(diào)用也是如此:他會(huì)根據(jù)調(diào)用者的動(dòng)態(tài)類型,來(lái)選取實(shí)際的目標(biāo)方法涧团。

JVM的靜態(tài)綁定和動(dòng)態(tài)綁定

Java虛擬機(jī)是怎么識(shí)別方法的只磷?

Java虛擬機(jī)識(shí)別方法的關(guān)鍵在于類名经磅、方法名以及方法描述符(method descriptor)。方法描述符钮追,他是由方法的參數(shù)類型以及返回類型所構(gòu)成预厌。在同一個(gè)類中,如果同時(shí)出現(xiàn)多個(gè)名字相同且描述符也相同的方法元媚,那么Java虛擬機(jī)會(huì)在類的驗(yàn)證階段報(bào)錯(cuò)轧叽。

Java虛擬機(jī)與Java語(yǔ)言不同,它并不限制名字與參數(shù)類型相同刊棕,但返回類型不同的方法出現(xiàn)在同一個(gè)類中炭晒,對(duì)于調(diào)用這些方法的字節(jié)碼來(lái)說(shuō),由于字節(jié)碼所附帶的方法描述符包含了返回類型甥角,因此Java虛擬機(jī)能夠準(zhǔn)確地識(shí)別目標(biāo)方法网严。

Java虛擬機(jī)中關(guān)于方法重寫(xiě)的判定同樣基于方法描述符。也就是說(shuō)嗤无,如果子類定義了與父類中非私有震束、非靜態(tài)方法同名的方法,那么只有當(dāng)這兩個(gè)方法的參數(shù)類型以及返回類型一致当犯,Java虛擬機(jī)才會(huì)判定為重寫(xiě)垢村。

對(duì)于Java語(yǔ)言中重寫(xiě)而Java虛擬機(jī)中非重寫(xiě)的情況,編譯器會(huì)通過(guò)生成橋接方法來(lái)實(shí)現(xiàn)Java中的重寫(xiě)語(yǔ)義灶壶。

Java虛擬機(jī)中靜態(tài)綁定指的是在解析時(shí)便能夠直接識(shí)別目標(biāo)方法的情況肝断,而動(dòng)態(tài)綁定則指的是需要在運(yùn)行過(guò)程中根據(jù)調(diào)用者的動(dòng)態(tài)類型來(lái)識(shí)別目標(biāo)方法的情況。

總的來(lái)說(shuō)驰凛,Java字節(jié)碼中與調(diào)用相關(guān)的指令共有五種胸懈。

1、invokestatic:用于調(diào)用靜態(tài)方法恰响。

2趣钱、invokespecial:用于調(diào)用私有實(shí)例方法、構(gòu)造器胚宦,以及使用super關(guān)鍵字調(diào)用父類的實(shí)例方法或構(gòu)造器首有,和所實(shí)現(xiàn)接口的默認(rèn)方法

3、invokevirtual:用于調(diào)用非私有實(shí)例方法枢劝。

4井联、invokeinterface:用于調(diào)用接口方法。

5您旁、invokedynamic:用于調(diào)用動(dòng)態(tài)方法烙常。


出處:《極客時(shí)間》 鄭雨迪老師的《深入拆解Java虛擬機(jī)》

備注:純屬督促自己復(fù)習(xí),梳理每節(jié)知識(shí)點(diǎn)鹤盒。如有錯(cuò)誤蚕脏,請(qǐng)多加指出侦副。謝謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驼鞭,隨后出現(xiàn)的幾起案子秦驯,更是在濱河造成了極大的恐慌,老刑警劉巖挣棕,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译隘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡穴张,警方通過(guò)查閱死者的電腦和手機(jī)细燎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)皂甘,“玉大人玻驻,你說(shuō)我怎么就攤上這事〕フ恚” “怎么了璧瞬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渐夸。 經(jīng)常有香客問(wèn)我嗤锉,道長(zhǎng),這世上最難降的妖魔是什么墓塌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任瘟忱,我火速辦了婚禮,結(jié)果婚禮上苫幢,老公的妹妹穿的比我還像新娘访诱。我一直安慰自己,他們只是感情好韩肝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布触菜。 她就那樣靜靜地躺著,像睡著了一般哀峻。 火紅的嫁衣襯著肌膚如雪涡相。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天剩蟀,我揣著相機(jī)與錄音催蝗,去河邊找鬼。 笑死育特,一個(gè)胖子當(dāng)著我的面吹牛生逸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼槽袄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锋谐?” 一聲冷哼從身側(cè)響起遍尺,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涮拗,沒(méi)想到半個(gè)月后乾戏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡三热,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鼓择,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片就漾。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呐能,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抑堡,到底是詐尸還是另有隱情摆出,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布首妖,位于F島的核電站偎漫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏有缆。R本人自食惡果不足惜象踊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棚壁。 院中可真熱鬧杯矩,春花似錦、人聲如沸灌曙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)在刺。三九已至逆害,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚣驼,已是汗流浹背魄幕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颖杏,地道東北人纯陨。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親翼抠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咙轩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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