Java 官方說「沒有指標」,但參考型別變數本質上儲存的是物件在堆上的地址。為了直觀說明,本文暫稱其為「指標」,請記住:無指標運算、無記憶體釋放、無野指標——這就是 Java 的安全設計。
StringBuffer str = new StringBuffer("Hello world");
str,型別為 StringBuffer。str,完成「指向」關係。
StringBuffer str2 = str;
結果:str 與 str2 指向同一個物件。修改任一端可見內容變化。

str == str2:比較地址值,相同則必為同一物件。str.equals(str2):比較邏輯內容(需類別正確覆寫 equals)。== 為 false,equals 為 true。
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 是值傳遞還是引用傳遞」,你可以自信回答:只有值傳遞,參考型別傳的是地址值。