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

Java 參考型別深度解析:記憶體模型、賦值語義、final 陷阱與傳參本質

     編輯:Java 相關知識

前言:參考型別 ≠ 指標,但理解指標有助於理解參考

Java 官方說「沒有指標」,但參考型別變數本質上儲存的是物件在堆上的地址。為了直觀說明,本文暫稱其為「指標」,請記住:無指標運算、無記憶體釋放、無野指標——這就是 Java 的安全設計。

物件建立的三步曲

StringBuffer str = new StringBuffer("Hello world");
  1. new:在堆分配記憶體,建立物件,回傳地址。
  2. 宣告:在棧建立參考變數 str,型別為 StringBuffer。
  3. 賦值:將物件地址存入 str,完成「指向」關係。

物件建立記憶體示意圖

參考賦值:複製的是地址,不是物件

StringBuffer str2 = str;

結果:str 與 str2 指向同一個物件。修改任一端可見內容變化。

參考賦值示意圖

== vs equals:比較的是地址 vs 內容

  • str == str2:比較地址值,相同則必為同一物件。
  • str.equals(str2):比較邏輯內容(需類別正確覆寫 equals)。
  • 克隆物件:內容相同但地址不同,== 為 false,equals 為 true。

final 修飾參考型別:鎖定地址,不鎖定內容


final StringBuffer strConst = new StringBuffer();
strConst.append("OK");   // ✅ 合法:修改物件內容
strConst = null;         // ❌ 編譯錯誤:嘗試改變參考地址

口訣:final 鎖定「指向誰」,不鎖定「指向的物件長什麼樣」。

參數傳遞:值傳遞,傳的是參考值

Java 只有值傳遞。對於參考型別參數:

  • 實參的地址值被複製給形參。
  • 形參與實參指向同一物件,可修改物件內容。
  • 形參重新指向新物件(param = new Obj()),不影響實參。

void modify(StringBuffer sb) {
    sb.append("A");      // 影響外部物件
    sb = new StringBuffer(); // 只改變區域參考,外部無感
}

類比:像「遙控器」(參考)被複製了一把,兩把遙控器控制同一台「電視」(物件);換頻道(修改內容)雙方都看得到;但把遙控器指向另一台電視(重新賦值),原遙控器不受影響。

總結圖表

概念棧堆關鍵字
基本型別值—直接存值
參考型別地址物件指向物件
參考賦值複製地址共享物件淺拷貝
final 參考地址不可變內容可變鎖定指向
方法傳參複製地址值共享物件值傳遞

結語

搞懂「棧存參考、堆存物件、賦值複製地址、final 鎖地址、傳參傳地址值」這五句話,Java 參考型別就再無死角。下次面試問「Java 是值傳遞還是引用傳遞」,你可以自信回答:只有值傳遞,參考型別傳的是地址值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved