亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

高分面試分析jvm如何實(shí)現(xiàn)多態(tài)

 更新時(shí)間:2022年01月26日 15:09:49   作者:硬核子牙  
這篇文章主要介紹了講解了在面試中jvm如何實(shí)現(xiàn)多態(tài),怎樣回答才能得到高分的問(wèn)題分析,有需要的朋友可以借鑒參考下,祝大家早日升職加薪多多進(jìn)步

昨天就有一個(gè)小伙伴被一道面試題虐了,我也給了他一定深度的答案。但是我覺(jué)得不夠,我覺(jué)得應(yīng)該讓小伙伴們像我一樣,答題能答出驚喜感,于是就有了這篇文章。我會(huì)從Java層面到Hotshot源碼層面再到C++層面,完整分析這個(gè)問(wèn)題。

這道面試題在好一些的互聯(lián)網(wǎng)公司,尤其是一二線,問(wèn)到的概率非常大,建議小伙伴們把這篇文章吃透。

這樣說(shuō),六十分

多態(tài)是面向?qū)ο蟮娜筇匦灾唬覀€(gè)人認(rèn)為,當(dāng)時(shí)設(shè)計(jì)OOP機(jī)制的時(shí)候,能夠想到多態(tài)的人,真特么太牛叉了。

多態(tài)理論第一次有了具體實(shí)現(xiàn)是在第一款面向?qū)ο蟮木幊陶Z(yǔ)言中,這個(gè)語(yǔ)言可能很多人沒(méi)聽(tīng)過(guò):smalltalk。此后出現(xiàn)的只要具備OOP機(jī)制的語(yǔ)言,都或多或少模仿或借鑒了前面語(yǔ)言的OOP實(shí)現(xiàn)機(jī)制。C++有沒(méi)有模仿或借鑒smalltalk,我不敢說(shuō),沒(méi)特別研究過(guò)smalltalk。但是我敢說(shuō),Java的多態(tài)是幾乎百分百模仿C++的多態(tài)實(shí)現(xiàn)的,不過(guò)做了一些細(xì)化。C++中只有直接調(diào)用、間接調(diào)用,而JVM通過(guò)不同的invoke指令來(lái)實(shí)現(xiàn)不同屬性的方法調(diào)用,這點(diǎn)后文會(huì)講到。

那什么是多態(tài)呢,滿足下面這幾個(gè)條件就可以稱為多態(tài):

1、繼承了某個(gè)類、實(shí)現(xiàn)了某個(gè)接口

2、重寫父類的方法、實(shí)現(xiàn)接口中的方法

3、父類引用指向子類對(duì)象

其實(shí)面試官問(wèn)的這個(gè)問(wèn)題,你這樣回答也算就著他這個(gè)問(wèn)題做了回答。但是顯然,面試官想聽(tīng)的不是這些,而是父類引用指向子類對(duì)象,進(jìn)行方法調(diào)用,這個(gè)JVM底層是如何實(shí)現(xiàn)的。面試題就是為了篩人,所以面試的時(shí)候,能答多深就答多深,絕對(duì)加分。

順便說(shuō)下,經(jīng)常跟多態(tài)聯(lián)系在一起的兩個(gè)詞:動(dòng)態(tài)綁定、晚綁定。別到時(shí)面試官說(shuō)這兩個(gè)詞,你一臉懵,那真的很掉分,面試官的臉色一下就暗淡灰沉下去了。當(dāng)面試官看到你的第一眼,心里給了你60分鐘時(shí)間來(lái)表現(xiàn),這下直接掉到5分鐘。更直接一點(diǎn)的,可能找個(gè)借口就走人了。

這樣說(shuō),七八十分

C++中的間接調(diào)用與直接調(diào)用,JVM抽象成了4個(gè)指令來(lái)完成:

1、invokevirtual:咱們平時(shí)寫代碼調(diào)用方法,最常用的就是這個(gè)指令。這個(gè)指令用于調(diào)用public、protected修飾,且不被static、final修飾的方法。跟多態(tài)機(jī)制有關(guān)。

2、invokeinterface:跟invokevirtual差不多。區(qū)別是多態(tài)調(diào)用時(shí),如果父類引用是對(duì)象,就用invokevirtual。如果父類引用是接口,就用這個(gè)。

3、invokespecial:只用于調(diào)用私有方法,構(gòu)造方法。跟多態(tài)機(jī)制無(wú)關(guān)。

4、invokestatic:只用于調(diào)用靜態(tài)方法。與多態(tài)機(jī)制無(wú)關(guān)。

跟面試官當(dāng)然要扯點(diǎn)高逼格的對(duì)吧,那咱們就講講invokeinterface。這個(gè)指令為什么逼格高呢?因?yàn)樗牡讓訉?shí)現(xiàn)比其他幾個(gè)指令都要復(fù)雜,如圖

其他的invoke指令的后面就是2個(gè)字節(jié)的操作數(shù),拿著操作數(shù)去常量池中就可以找到類信息、方法信息。但是invokeinterface你會(huì)發(fā)現(xiàn),它后面操作數(shù)占了4個(gè)字節(jié),這4個(gè)字節(jié)還不全是常量池索引,一起看下這個(gè)指令的結(jié)構(gòu),上圖:

這個(gè)指令格式我解釋一下:

1、第二個(gè)字節(jié)跟第三個(gè)字節(jié)合起來(lái)是常量池的索引,對(duì)應(yīng)常量池項(xiàng)JVM_CONSTANT_InterfaceMethodref,這里面包含接口的元信息、方法信息。

2、第四個(gè)字節(jié)是這個(gè)方法的參數(shù)個(gè)數(shù)。是不是有小伙伴覺(jué)得很奇怪,show方法沒(méi)有參數(shù)呀,這邊怎么是1,是JVM的bug?呵,如果JVM有這么低級(jí)的bug,JVM也不會(huì)有今天的地位了。非靜態(tài)方法就算沒(méi)有參數(shù),也默認(rèn)有一個(gè),就是this指針。

其實(shí)這個(gè)參數(shù)個(gè)數(shù)完全沒(méi)必要記錄,可以通過(guò)解析方法的簽名計(jì)算出來(lái),不明白當(dāng)時(shí)為什么做這樣的設(shè)計(jì)。面試的時(shí)候這點(diǎn)記得說(shuō),很加分。其實(shí)字節(jié)碼文件中有很多可以優(yōu)化的點(diǎn),后面準(zhǔn)備共享這方面的面試題,沒(méi)人想打我吧。^_^

3、第五個(gè)字節(jié)永遠(yuǎn)為0,歷史原因遺留。我查了一些資料,得到的答案是:為額外的運(yùn)算元預(yù)留空間。子牙老師表示這個(gè)字我都認(rèn)識(shí),但是它組合在一起表達(dá)的意思我真不懂,是不是我太菜了。哎,還是太菜了。

有些小伙伴可能就想:答到這個(gè)份上才七八十分?那后面還能怎么說(shuō)哦。咱們現(xiàn)在才只說(shuō)到invokeinterface指令,那這個(gè)指令是怎么找到要調(diào)用的方法的呢?JVM的虛表機(jī)制到底是什么樣的呢?又是怎么與C++的虛表機(jī)制合二為一的呢?虛表分發(fā)機(jī)制又是怎樣的呢?這些才是這個(gè)問(wèn)題的精髓。

這點(diǎn)就留到下篇文章寫吧。文章太長(zhǎng),讀起來(lái)也疲憊。

傳送門 高分面試從Hotspot源碼層面剖析java多態(tài)實(shí)現(xiàn)原理

以上就是高分面試分析jvm如何實(shí)現(xiàn)多態(tài)的詳細(xì)內(nèi)容,更多關(guān)于jvm實(shí)現(xiàn)多態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java線程的生命周期命名與獲取代碼實(shí)現(xiàn)

    Java線程的生命周期命名與獲取代碼實(shí)現(xiàn)

    這篇文章主要介紹了Java線程的生命周期命名與獲取代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java WebService 簡(jiǎn)單實(shí)例(附實(shí)例代碼)

    Java WebService 簡(jiǎn)單實(shí)例(附實(shí)例代碼)

    本篇文章主要介紹了Java WebService 簡(jiǎn)單實(shí)例(附實(shí)例代碼), Web Service 是一種新的web應(yīng)用程序分支,他們是自包含、自描述、模塊化的應(yīng)用,可以發(fā)布、定位、通過(guò)web調(diào)用。有興趣的可以了解一下
    2017-01-01
  • java如何將實(shí)體類轉(zhuǎn)換成json并在控制臺(tái)輸出

    java如何將實(shí)體類轉(zhuǎn)換成json并在控制臺(tái)輸出

    這篇文章主要介紹了java如何將實(shí)體類轉(zhuǎn)換成json并在控制臺(tái)輸出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java隨機(jī)生成字符串的四種方式例子

    Java隨機(jī)生成字符串的四種方式例子

    這篇文章主要給大家介紹了關(guān)于Java隨機(jī)生成字符串的四種方式,隨機(jī)數(shù)在實(shí)際中使用很廣泛,比如要隨即生成一個(gè)固定長(zhǎng)度的字符串、數(shù)字,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問(wèn)題

    MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問(wèn)題

    這篇文章主要介紹了MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springboot之聯(lián)表查詢方式

    springboot之聯(lián)表查詢方式

    這篇文章主要介紹了springboot之聯(lián)表查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java獲取鍵盤輸入的數(shù)字,并進(jìn)行排序的方法

    java獲取鍵盤輸入的數(shù)字,并進(jìn)行排序的方法

    今天小編就為大家分享一篇java獲取鍵盤輸入的數(shù)字,并進(jìn)行排序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • SpringBoot http post請(qǐng)求數(shù)據(jù)大小設(shè)置操作

    SpringBoot http post請(qǐng)求數(shù)據(jù)大小設(shè)置操作

    這篇文章主要介紹了SpringBoot http post請(qǐng)求數(shù)據(jù)大小設(shè)置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 詳解Java線程-守護(hù)線程與用戶線程

    詳解Java線程-守護(hù)線程與用戶線程

    這篇文章主要介紹了Java守護(hù)線程與用戶線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用springboot訪問(wèn)圖片本地路徑并映射成url

    使用springboot訪問(wèn)圖片本地路徑并映射成url

    這篇文章主要介紹了使用springboot訪問(wèn)圖片本地路徑并映射成url的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論