最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年01月26日 09:30:40   作者:子牙_公號硬核子牙  
這篇文章主要為大家介紹了在面試中從Hotspot源碼層面來剖析java多態(tài)的實現(xiàn)原理,這樣回答薪資隨你開,有需要的朋友可以借鑒參考下,希望大家多多加薪

本篇文章是接上篇文章【JVM的多態(tài)是如何實現(xiàn)的】寫的,如果你還沒看過,墻裂都建議你看一下。

傳送門  高分面試分析jvm如何實現(xiàn)多態(tài)

上篇文章我給出了這道面試題的及格分的回答及七八十分的回答,今天我就告訴大家如果想回答得接近滿分,應該怎么回答。因為會設(shè)計到C++的虛表及C++的多態(tài)實現(xiàn),如何這塊你不理解或不熟,面試中建議別拿出來說,免得碰到懂C++給你來個連環(huán)call把你問懵了。

這邊給大家補一個知識點。我在昨天的文章里說:當時設(shè)計OOP機制的時候,能夠想到多態(tài)的人,真特么太牛叉了。我給大家講一下我為什么這樣說?;蛘哒f,OOP三大機制為什么就是封裝、繼承、多態(tài)。這么幾十年了,沒加一個、減一個或改一個。

由于多態(tài)需要通過動態(tài)綁定才能得以實現(xiàn),而綁定通俗一點講就是讓不同的對象對同一個函數(shù)進行調(diào)用,或者反過來講,就是讓同一個函數(shù)與不同的對象綁定起來,所以多態(tài)得以實現(xiàn)的一個大前提就是,編程語言必須是面向?qū)ο蟮?。同時,函數(shù)與對象相互綁定,意味著函數(shù)也屬于對象的一部分,這便具備了封裝的特性。因為有了封裝,才有了對象。同時,一個函數(shù)能夠綁定多個對象,意味著對各不同的對象具有相同的行為,這是繼承的含義。

因此,面向?qū)ο蟮娜筇匦匀币徊豢伞7庋b與繼承其實是為了多態(tài)準備的,或者說,封裝與繼承成全了多態(tài),多態(tài)讓封裝與繼承的意義最大化。

C++是如何實現(xiàn)多態(tài)的

多態(tài)的實現(xiàn),現(xiàn)在幾乎所有的編程語言都是基于虛表實現(xiàn)的,英文vtable。這里我沒有說全部,因為我也不是所有的語言都了解哈,不敢亂說,免得遭噴。^_^

C++的虛表在哪呢?在new創(chuàng)建的對象的頭部。虛表里面存儲的是什么呢?是虛函數(shù)。C++這塊的知識我就不講太多了,很多小伙伴不了解C++,講多了沒必要,作為一名Java程序員,了解到這個程度夠了。

因為hotshot主要是用C++寫的,講了C++的虛表,這張圖你應該就能看懂了。

不然總有小伙伴問我:Java的類對應的C++對象,為什么有C++級別的虛表啊。我沒看到哪里有這樣的代碼啊。

搞清楚了虛表,再來了解虛表分發(fā)就容易多了。虛表分發(fā),其實就是通過虛表內(nèi)存地址拿到虛表記錄,然后通過函數(shù)名+內(nèi)含參數(shù)信息及返回值信息的簽名去虛表中找。因為是從前往后找,所以如果子類重寫了父類的方法,會調(diào)用子類的方法。

C++的虛表分發(fā),我只是簡單講了下,講多了大家沒概念。JVM的虛表分發(fā),我等下會講得詳細一些。很多現(xiàn)象,如果不了解它的底層,是不是百思不得其解。有那么多為什么?為什么?^_^

所以Java雖好,底層也很重要。順便說下,虛表就是用數(shù)組實現(xiàn)的,沒有有些小伙伴想得那么復雜。

JVM中的虛表

JVM的虛表跟C++的虛表還不太一樣。不一樣體現(xiàn)在哪呢?研究虛表研究三個東西:虛表在哪、虛表是用什么結(jié)構(gòu)實現(xiàn)的、虛表分發(fā)機制是怎樣的。JVM的虛表分發(fā)等下講,JVM的虛表也是用數(shù)組實現(xiàn)的,那這個不一樣就體現(xiàn)在虛表在哪?

Java的類,JVM中對應的C++對象是klass模型。Java的對象,JVM中對應的C++對象是oop模型。C++中的虛表在對象頭中,而JVM的虛表在klass模型的頭部,即Java類對象的頭部。這點區(qū)別一定要記住,這樣你才能理解Java對象的內(nèi)存布局。

問個問題:我們隨便定義的一個類,它有沒有JVM虛表呢?其實是有的。那是哪些方法的內(nèi)存地址呢?回答這個問題前先得搞明白:什么樣的方法會存入虛表。只有public、protect類型的,且不被static、final修飾的方法才能被多態(tài)調(diào)用,才會進入虛表。因為Java中所有的類都是Object的子類,所以O(shè)bject中滿足這個條件的方法都會在每個類的虛表中。

又到了小伙伴不服氣環(huán)節(jié)。么事,上證據(jù)。具體怎么查看我就不講了,有點復雜。對hotspot沒一定的功力講了也沒概念。

Java是如何實現(xiàn)虛表分發(fā)

有些小伙伴不理解:我只會Java干活都沒問題呀,我為什么要學底層呢?那你想進大廠跟優(yōu)秀的人成為同事嗎?你想成為別人眼中的大佬嗎?你希望在某個領(lǐng)域能有一定的名氣嗎……這些都需要實力來支撐。

有些小伙伴說:我手寫一個JVM干什么呢?那我就用我手寫的JVM來講解這個知識點。這就是你有一個手寫JVM的意義之一。

JVM實現(xiàn)虛表分發(fā),對應的字節(jié)碼指令有兩個:invokevirtual、invokeinterface。上篇文章咱們深入講解了invokeinterface,這篇文章咱們繼續(xù)拿這個指令來講這個知識點。我們來看看JVM是如何分發(fā)的。其實一看執(zhí)行invokeinterface時的堆棧,你應該就能明白了。

雖然invokeinterface后面的操作數(shù)是接口方法信息。但是真正的對象會作為this傳過來。所以在調(diào)用的時候,從操作數(shù)棧拿到真正的對象,然后通過對象頭中的類型指針拿到TestDuotai對應的C++類對象,即klass模型。前面說了,虛表就在這個對象的頭部。然后通過函數(shù)名+內(nèi)含參數(shù)信息及返回值信息的簽名去虛表中找。因為是從前往后找,所以如果子類重寫了父類的方法,會調(diào)用子類的方法。這就是JVM虛表分發(fā)的底層原理。

以上就是高分面試從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理的詳細內(nèi)容,更多關(guān)于hotspot源碼層面剖析java多態(tài)原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot集成MyBatis的多種方式

    SpringBoot集成MyBatis的多種方式

    本文深入解析了Spring Boot集成MyBatis的多種方式,包括XML配置、注解配置以及MyBatis的動態(tài)SQL等,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Java程序常見異常及處理匯總

    Java程序常見異常及處理匯總

    這篇文章主要介紹了java程序常見異常及處理匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • idea2020.1無法自動加載maven依賴的jar包問題及解決方法

    idea2020.1無法自動加載maven依賴的jar包問題及解決方法

    這篇文章主要介紹了idea2020.1無法自動加載maven依賴的jar包問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Springboot?格式化LocalDateTime的方法

    Springboot?格式化LocalDateTime的方法

    這篇文章主要介紹了Springboot格式化LocalDateTime的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換詳解

    JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換詳解

    以下是對JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • Java實現(xiàn)中國象棋的示例代碼

    Java實現(xiàn)中國象棋的示例代碼

    中國象棋是起源于中國的一種棋,屬于二人對抗性游戲的一種,在中國有著悠久的歷史。由于用具簡單,趣味性強,成為流行極為廣泛的棋藝活動。本文將利用Java實現(xiàn)這一經(jīng)典游戲,需要的可以參考一下
    2022-02-02
  • 詳解Java中wait和sleep的區(qū)別

    詳解Java中wait和sleep的區(qū)別

    這篇文章主要介紹了Java中wait和sleep的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • springboot之使用logback日志框架的圖文教程

    springboot之使用logback日志框架的圖文教程

    這篇文章主要介紹了springboot之使用logback日志框架的圖文教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java字符串與日期類型轉(zhuǎn)換的工具類

    java字符串與日期類型轉(zhuǎn)換的工具類

    這篇文章主要為大家詳細介紹了java字符串與日期類型轉(zhuǎn)換的工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java中提供synchronized后為什么還要提供Lock

    Java中提供synchronized后為什么還要提供Lock

    這篇文章主要介紹了Java中提供synchronized后為什么還要提供Lock,在Java中提供了synchronized關(guān)鍵字來保證只有一個線程能夠訪問同步代碼塊,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-03-03

最新評論

涿鹿县| 绥芬河市| 外汇| 疏勒县| 聊城市| 金乡县| 思茅市| 定结县| 兴业县| 长垣县| 勐海县| 淮阳县| 文登市| 怀远县| 运城市| 棋牌| 西和县| 紫云| 临朐县| 云林县| 万年县| 苏尼特左旗| 于田县| 普兰县| 武夷山市| 新巴尔虎左旗| 乡宁县| 宝应县| 英德市| 广南县| 麦盖提县| 闽清县| 子洲县| 桓仁| 南昌县| 武城县| 洛阳市| 连州市| 漯河市| 黎川县| 石阡县|