首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 向上/向下轉型與動態綁定:instanceof 守護、方法表機制深度解析

     編輯:Java 綜合教學

Java 向上/向下轉型與動態綁定:instanceof 守護、方法表機制深度解析

一、向上轉型

Father father = new Son(); // 自動發生,安全無風險
  • 子類對象賦值給父類引用
  • 編譯期類型為 Father,運行期類型為 Son
  • 只能訪問 Father 定義的成員,調用被覆蓋方法時觸發動態綁定

二、向下轉型

Father f = new Father();
if (f instanceof Son) { // 必須守護
    Son son = (Son) f; // 安全轉型
}
  • 父類引用轉為子類引用,高風險
  • 鐵律:轉型前必須 instanceof 判斷,否則拋 ClassCastException
  • 僅當對象實際類型為目標子類或其子類時轉型成功

三、動態綁定核心機制

問題:Father f = new Son(); f.test(); 編譯器如何知道調用 Son.test()?

JVM 內存模型

對象內存佈局

  • 對象頭:指向方法區類元數據的指針
  • 實例數據:字段值

方法表

方法表佈局

  • 存儲在方法區,屬於類元數據
  • 數組結構,每個槽位存一個實例方法入口地址
  • 佈局規則:父類方法在前 → 子類方法在後;覆蓋方法佔據父類原槽位
  • 不包含 static/private/final 方法(靜態綁定)

調用流程

  1. 通過對象引用找到對象頭
  2. 順指針定位類元數據
  3. 讀取方法表固定索引(如 test() 索引為 1)
  4. 索引指向的入口地址即為實際類型的實現(Son.test)
  5. 執行字節碼

代碼演示

public class Base {
    public void test() { System.out.println("in Base"); }
    public void print() {}
}

public class Derive extends Base {
    @Override
    public void test() { System.out.println("in Derive"); }
    public void sayHello() {}
}

public static void main(String[] args) {
    Base b = new Derive();
    b.test(); // 輸出 "in Derive"
}

方法表中 test() 索引 1 在 Base 和 Derive 中位置固定,Derive 覆蓋版本覆寫該槽位,實現運行期分派。

總結

  • 向上轉型:隱式、安全、啟用多態
  • 向下轉型:顯式、需 instanceof 守護、窄化類型
  • 動態綁定本質:方法表索引固定 + 運行期類型解析具體入口
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved