亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Java常見知識點中的分派機制

發布時間:2021-11-20 15:23:56 來源:億速云 閱讀:208 作者:柒染 欄目:軟件技術

如何理解Java常見知識點中的分派機制,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

在Java中,符合“編譯時可知,運行時不可變”這個要求的方法主要是靜態方法和私有方法。這兩種方法都不能通過繼承或別的方法重寫,因此它們適合在類加載時進行解析。

Java虛擬機中有四種方法調用指令

  • invokestatic:調用靜態方法。

  • invokespecial:調用實例構造器方法,私有方法和super。

  • invokeinterface:調用接口方法。

  • invokevirtual:調用以上指令不能調用的方法(虛方法)。

只要能被invokestatic和invokespecial指令調用的方法,都可以在解析階段確定唯一的調用版本,符合這個條件的有:靜態方法、私有方法、實例構造器、父類方法,他們在類加載的時候就會把符號引用解析為該方法的直接引用。這些方法被稱為非虛方法,反之其他方法稱為虛方法(final方法除外)。

雖然final方法是使用invokevirtual 指令來調用的,但是由于它無法被覆蓋,多態的選擇是唯一的,所以是一種非虛方法。

一. 靜態分派

對于類字段的訪問也是采用靜態分派

People man = new Man()

靜態分派主要針對重載,方法調用時如何選擇。在上面的代碼中,People被稱為變量的引用類型,Man被稱為變量的實際類型。靜態類型是在編譯時可知的,而動態類型是在運行時可知的,編譯器不能知道一個變量的實際類型是什么。

編譯器在重載時候通過參數的靜態類型而不是實際類型作為判斷依據。并且靜態類型在編譯時是可知的,所以編譯器根據重載的參數的靜態類型進行方法選擇。

在某些情況下有多個重載,那編譯器如何選擇呢? 編譯器會選擇”最合適”的函數版本,那么怎么判斷”最合適“呢?越接近傳入參數的類型,越容易被調用。

二. 動態分派

動態分派主要針對重寫,使用invokevirtual指令調用。invokevirtual指令多態查找過程:

  • 找到操作數棧頂的第一個元素所指向的對象的實際類型,記為C。

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

  • 否則,按照繼承關系從下往上一次對C的各個父類進行第2步的搜索和驗證過程。

  • 如果始終沒有找到合適的方法,則拋出 java.lang.AbstractMethodError異常。

三. 虛擬機動態分派的實現

由于動態分派是非常繁瑣的動作,而且動態分派的方法版本選擇需要考慮運行時在類的方法元數據中搜索合適的目標方法,因此在虛擬機的實現中基于性能的考慮,在方法區中建立一個虛方法表(invokeinterface 有接口方法表),來提高性能。

虛方法表中存放各個方法的實際入口地址。如果某個方法在子類沒有重寫,那么子類的虛方法表里的入口和父類入口一致,如果子類重寫了這個方法,那么子類方法表中的地址會被替換為子類實現版本的入口地址。

關于如何理解Java常見知識點中的分派機制問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤壁市| 泾阳县| 安达市| 天台县| 邯郸县| 北票市| 甘肃省| 滦南县| 富源县| 常宁市| 牡丹江市| 乌兰察布市| 贺兰县| 武宣县| 海城市| 普定县| 永年县| 南岸区| 陕西省| 洛扎县| 岳普湖县| 松潘县| 怀仁县| 东台市| 札达县| 金堂县| 三原县| 府谷县| 临邑县| 赞皇县| 青河县| 同心县| 广德县| 华池县| 漳平市| 大名县| 星座| 新乡县| 资阳市| 诏安县| 东至县|