Java虛擬機 -方法調用

方法調用

  • 方法調用
    • 靜態鏈接
    • 動態鏈接
    • 案例
    • 虛方法與非虛方法
      • 虛方法(Virtual Method)
      • 非虛方法(Non-Virtual Method)
    • 方法返回地址

方法調用

我們編寫Java程序的時候,我們自己寫的類通常不僅僅是調用自己本類的方法。調用別的類的方法的時候,從字節碼的角度,我們調用別的類的方法,字節碼里面存儲的是別的類的符號引用。
在這里插入圖片描述
但是JVM運行的時候,我們需要一個機制去把這個符號,轉化成實際的引用的類方法的地址,這樣我們運行的時候,才能夠找到要調用的方法。
在JVM中,將符號引用轉化為調用方法的直接引用與方法的綁定機制有關,方法的綁定機制有兩種:

  1. 靜態綁定
  2. 動態綁定

靜態鏈接

Java源代碼轉化成字節碼文件裝載到JVM區域的時候,如果被調用的類的目標方法,編譯期間就可以確定下來的話,而且運行期間不會變。這時候,我們可以將調用方法的符號引用直接轉化成目標方法的直接引用,這種情況就是靜態鏈接或者早期綁定。

動態鏈接

被調用的方法如果編譯期間無法確定下來,這種情況,程序只能夠在運行期間將調用方法的符號引用轉化成直接引用,這種情況就叫動態鏈接或者晚期綁定。

案例

class Student{public void study() {System.out.println("begin study");}
}interface Play{public void play();
}class JuniorStudent extends Student implements Play{@Overridepublic void play() {System.out.println("JuniorStudent play");}
}class MiddleStudent extends Student implements Play{@Overridepublic void play() {System.out.println("MiddleStudent play");}
}public class LinkTest {public void play(Play play) {play.play();}public void study(Student student) {student.study();}
}

虛方法與非虛方法

JVM的實現機制

  1. 虛方法調用
    JVM使用虛方法表(vtable)實現動態分派。每個類維護一個虛方法表,記錄方法的實際入口地址。調用時根據對象的實際類型查表,找到正確的方法實現。
  2. 非虛方法調用
    直接通過符號引用在編譯期確定調用目標,無需運行時查找。

虛方法(Virtual Method)

虛方法是支持動態綁定(運行時綁定)的方法,具體調用的方法實現由對象的實際類型(運行時類型)決定。Java中,默認情況下,未被final、private或static修飾的實例方法都是虛方法。

特點

  • 動態綁定:方法調用在運行時根據對象的實際類型確定。

  • 支持多態:允許子類重寫(Override)父類方法,實現多態。

  • 虛方法表(vtable):JVM通過虛方法表快速查找方法的實際實現。

class Animal {public void speak() { // 虛方法(可被重寫)System.out.println("Animal speaks");}
}class Dog extends Animal {@Overridepublic void speak() { // 重寫父類方法System.out.println("Dog barks");}
}public class Test {public static void main(String[] args) {Animal animal = new Dog();animal.speak(); // 輸出 "Dog barks"(動態綁定到Dog的speak方法)}
}

常見虛方法

  • 普通實例方法(未被final、private、static修飾)。

  • 接口的默認方法(default方法)。

  • 抽象方法(abstract方法)。

非虛方法(Non-Virtual Method)

非虛方法是靜態綁定(編譯時綁定)的方法,調用的具體方法在編譯期就能確定,與對象的實際類型無關。這些方法無法被重寫,或不需要動態分派。

特點

  • 靜態綁定:方法調用在編譯時確定。

  • 無法被重寫:子類無法修改其行為。

  • 性能更高:無需運行時查找方法表。

class Parent {public static void staticMethod() { // 非虛方法(靜態方法)System.out.println("Parent's static method");}private void privateMethod() { // 非虛方法(private方法)System.out.println("Parent's private method");}public final void finalMethod() { // 非虛方法(final方法)System.out.println("Parent's final method");}
}class Child extends Parent {// 嘗試重寫靜態方法(實際是隱藏,而非重寫)public static void staticMethod() {System.out.println("Child's static method");}// 無法重寫private方法和final方法
}public class Test {public static void main(String[] args) {Parent parent = new Child();parent.staticMethod(); // 輸出 "Parent's static method"(靜態綁定)}
}

常見的非虛方法

  • 靜態方法(static):屬于類,調用時基于引用類型。

  • 私有方法(private):僅在類內部可見,無法被重寫。

  • final方法:禁止子類重寫。

  • 構造方法:隱式調用,無法被動態分派。

  • 通過super調用的父類方法:直接指定父類實現。

方法返回地址

當一個方法開始執行之后,只有兩種可能:

  1. 正常結束,當前方法棧幀出棧, 返回上一個方法的棧幀;
  2. 異常結束,如果本方法沒有處理異常的方法,方法就會異常退出,不會給調用者提供任何返回值

無論是怎樣退出,在方法退出之后,都需要恢復到被調用之前的那個方法的棧幀的當時的狀態,程序才能正常往下執行。從棧的角度,方法退出,實際上是當前棧幀出棧,要恢復上層方法的局部變量表與操作數棧,如果有返回值,還需要把返回值壓入操作數棧,然后將程序計數器指向上層方法的下一條指令的地址。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81883.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【 開源:跨平臺網絡數據傳輸的萬能工具libcurl】

在當今這個互聯互通的世界中,數據在各種設備和平臺之間自由流動,而 libcurl,就像一把跨平臺的萬能工具,為開發者提供了處理各種網絡數據傳輸任務所需的強大功能。它不僅是一個庫,更是一種通用的解決方案,可…

ElasticSearch 8.x 快速上手并了解核心概念

目錄 核心概念概念總結 常見操作索引的常見操作常見的數據類型指定索引庫字段類型mapping查看索引庫的字段類型最高頻使用的數據類型 核心概念 在新版Elasticsearch中,文檔document就是一行記錄(json),而這些記錄存在于索引庫(index)中, 索引名稱必須是…

優化 CRM 架構,解鎖企業競爭力密碼

引言 “在所有企業面臨的挑戰中,客戶關系管理無疑是最為關鍵的一環。” —— 彼得德魯克 在數字化浪潮席卷的當下,企業面臨著前所未有的機遇與挑戰。客戶關系管理(CRM)作為企業運營的核心環節,其架構的優劣直接影響著…

深入理解Docker和K8S

深入理解Docker和K8S Docker 是大型架構的必備技能,也是云原生核心。Docker 容器化作為一種輕量級的虛擬化技術,其核心思想:將應用程序及其所有依賴項打包在一起,形成一個可移植的單元。 容器的本質是進程: 容器是在…

list.forEach(s -> countService.refreshArticleStatisticInfo(s.getId())); 講解一下語法

這段代碼使用了Java中的forEach方法結合Lambda表達式來遍歷一個列表,并對列表中的每個元素執行特定操作。具體來說,它會遍歷列表中的每一個元素,并調用countService.refreshArticleStatisticInfo(s.getId())方法來刷新每個文章的統計信息。下…

AI開發者的算力革命:GpuGeek平臺全景實戰指南(大模型訓練/推理/微調全解析)

目錄 背景一、AI工業化時代的算力困局與破局之道1.1 中小企業AI落地的三大障礙1.2 GpuGeek的破局創新1.3 核心價值 二、GpuGeek技術全景剖析2.1 核心架構設計 三、核心優勢詳解?3.1 優勢1:工業級顯卡艦隊???3.2 優勢2:開箱即用生態?3.2.1 預置鏡像庫…

05算法學習_59. 螺旋矩陣 II

05算法學習_59. 螺旋矩陣 II 05算法學習_59. 螺旋矩陣 II題目描述:個人代碼:學習思路:第一種寫法:題解關鍵點: 個人學習時疑惑點解答: 05算法學習_59. 螺旋矩陣 II 力扣題目鏈接: 59. 螺旋矩陣 II 題目描…

JDK7Hashmap的頭插法造成的環問題

單線程下的擴容 多線程下的擴容 next=e 然后e的next變成e

JAVA|后端編碼規范

目錄 零、引言 一、基礎 二、集合 三、并發 四、日志 五、安全 零、引言 規范等級: 【強制】:強制遵守,來源于線上歷史故障,將通過工具進行檢查。【推薦】:推薦遵守,來源于日常代碼審查、開發人員反饋…

2025-05-21 Python深度學習5——數據讀取

文章目錄 1 數據準備2 Dataset2.1 自定義 Dataset2.2 使用示例 3 TensorBoard3.1 安裝3.2 標量可視化(Scalars)3.3 圖像可視化(Images)3.4 其他常用功能 4 transform4.1 ToTensor()4.2 Normalize()4.3 Resize()4.4 Compose()4.5 C…

5月21日學習筆記

MYSQL三層結構 表1 數據庫DB1 表2 數據庫管理系統 客戶端命令終端(Dos) DBMS 數據庫DB2 表1 表2 數據庫………. Mysql數據庫-表的本質仍然是文件 表的一行稱之為一條記錄->在java程序中一行記錄往往使用對象表示 SQL語…

二十、面向對象底層邏輯-ServiceRegistry接口設計集成注冊中心

一、服務治理的基石接口 在微服務架構中,服務實例的動態注冊與發現是保證系統彈性的關鍵機制。Spring Cloud Commons模塊通過ServiceRegistry與Registration接口定義了服務注冊的標準化模型,為不同服務發現組件(Eureka、Consul、Nacos等&…

DeepSeek:以開源之力,引領AI技術新風潮

在年春節,大語言模型DeepSeek如同一枚震撼彈,在全球范圍內引發了轟動,成功“破圈”,將中國的人工智能(AI)技術成果推向了世界舞臺。 開源策略:打破技術壁壘 在AI行業,OpenAI等巨頭…

完整改進RIME算法,基于修正多項式微分學習算子Rime-ice增長優化器,完整MATLAB代碼獲取

1 簡介 為了有效地利用霧狀冰生長的物理現象,最近開發了一種優化算法——霧狀優化算法(RIME)。它模擬硬霧狀和軟霧狀過程,構建硬霧狀穿刺和軟霧狀搜索機制。在本研究中,引入了一種增強版本,稱為修改的RIME…

PyTorch可視化工具——使用Visdom進行深度學習可視化

文章目錄 前置環境Visdom安裝并啟動VisdomVisdom圖形APIVisdom靜態更新API詳解通用參數說明使用示例Visdom動態更新API詳解1. 使用updateappend參數2. ~~使用vis.updateTrace方法~~3. 完整訓練監控示例 Visdom可視化操作散點圖plot.scatter()散點圖案例線性圖vis.line()vis.lin…

Java使用Collections集合工具類

1、Collections 集合工具類 Java 中的 Collections 是一個非常有用的工具類,它提供了許多靜態方法來操作或返回集合。這個類位于 java.util 包中,主要包含對集合進行操作的方法,比如排序、搜索、線程安全化等。 Java集合工具類的使用&#x…

Unity基礎學習(五)Mono中的重要內容(1)延時函數

目錄 一、Mono中的延時函數Invoke 1. Invoke作用:延遲指定時間后執行一次函數。API: 2. InvokeRepeating作用:延遲后開始重復執行函數。API: 3. CancelInvoke作用:停止所有延時函數,或停止指定函數的延時…

180KHz 60V 5A開關電流升壓/升降壓型DC-DC轉換器XL4019升降壓芯片

介紹 XL6019是一款專為升壓、升降壓設計的 單片集成電路(升壓和降壓是由外圍電路拓撲確定的),可工作在DC5V到40V輸入電 壓范圍,低紋波,內置功率MOS。XL6019內 置固定頻率振蕩器與頻率補償電路,簡化了電 路…

如何暢通需求收集渠道,獲取用戶反饋?

要暢通需求收集渠道、有效獲取用戶反饋,核心在于多樣化反饋入口、閉環反饋機制、用戶分層管理、反饋數據結構化分析等四個方面。其中,多樣化反饋入口至關重要,不同用戶有不同的溝通偏好,只有覆蓋多個反饋路徑,才能捕捉…

Python結合ollama和stramlit開發聊天機器人

Python結合ollama和stramlit開發聊天機器人 一、環境準備1、streamlit安裝2、langchain安裝3、ollama的安裝 二、Ollama平臺聊天機器人實現1、需求2、模型調用3、前端實現頁面呈現代碼實現 三、詳細代碼地址四、參考資源 一、環境準備 1、streamlit安裝 # 通過 pip 安裝 pip …