欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

多態(tài)的實(shí)現(xiàn),現(xiàn)在幾乎所有的編程語言都是基于虛表實(shí)現(xiàn)的,英文vtable。這里我沒有說全部,因?yàn)槲乙膊皇撬械恼Z言都了解哈,不敢亂說,免得遭噴。^_^

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

因?yàn)閔otshot主要是用C++寫的,講了C++的虛表,這張圖你應(yīng)該就能看懂了。

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

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

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

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

JVM中的虛表

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

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

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

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

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

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

有些小伙伴說:我手寫一個(gè)JVM干什么呢?那我就用我手寫的JVM來講解這個(gè)知識(shí)點(diǎn)。這就是你有一個(gè)手寫JVM的意義之一。

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

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

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

相關(guān)文章

  • Spring Boot通過Junit實(shí)現(xiàn)單元測(cè)試過程解析

    Spring Boot通過Junit實(shí)現(xiàn)單元測(cè)試過程解析

    這篇文章主要介紹了Spring Boot通過Junit實(shí)現(xiàn)單元測(cè)試過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Jenkins環(huán)境搭建實(shí)現(xiàn)過程圖解

    Jenkins環(huán)境搭建實(shí)現(xiàn)過程圖解

    這篇文章主要介紹了Jenkins環(huán)境搭建實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java實(shí)現(xiàn)獲取網(wǎng)站的keywords,description

    java實(shí)現(xiàn)獲取網(wǎng)站的keywords,description

    這篇文章主要介紹了java實(shí)現(xiàn)獲取網(wǎng)站的keywords,description的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • SpringBoot如何通過yml方式整合Mybatis

    SpringBoot如何通過yml方式整合Mybatis

    這篇文章主要介紹了SpringBoot如何通過yml方式整合Mybatis,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 談?wù)凥ttpClient使用詳解

    談?wù)凥ttpClient使用詳解

    這篇文章給大家介紹HttpClient使用,httpClient是一個(gè)客戶端的http通信實(shí)現(xiàn)庫,HttpClient的目標(biāo)是發(fā)送和接收HTTP報(bào)文。本文講解的非常詳細(xì),對(duì)HttpClient使用感興趣的朋友可以參考下
    2015-10-10
  • Java實(shí)現(xiàn)班級(jí)管理系統(tǒng)

    Java實(shí)現(xiàn)班級(jí)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)班級(jí)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java如何自定義類數(shù)組的創(chuàng)建和初始化

    Java如何自定義類數(shù)組的創(chuàng)建和初始化

    這篇文章主要介紹了Java如何自定義類數(shù)組的創(chuàng)建和初始化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 多線程并發(fā)AbstractQueuedSynchronizer詳情

    Java 多線程并發(fā)AbstractQueuedSynchronizer詳情

    這篇文章主要介紹了Java 多線程并發(fā)AbstractQueuedSynchronizer詳情,文章圍繞主題展開想象的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • 一文快速了解spring?boot中的@idempotent注解

    一文快速了解spring?boot中的@idempotent注解

    idempotence注解是RESTful API設(shè)計(jì)中一個(gè)重要的概念,它可以保證操作的可靠性和一致性,下面這篇文章主要給大家介紹了關(guān)于spring?boot中@idempotent注解的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java中List排序的三種實(shí)現(xiàn)方法實(shí)例

    Java中List排序的三種實(shí)現(xiàn)方法實(shí)例

    其實(shí)Java針對(duì)數(shù)組和List的排序都有實(shí)現(xiàn),對(duì)數(shù)組而言你可以直接使用Arrays.sort,對(duì)于List和Vector而言,你可以使用Collections.sort方法,下面這篇文章主要給大家介紹了關(guān)于Java中List排序的三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2021-12-12

最新評(píng)論