「Java 是傳值還是傳引用?」
結論:Java 永遠是「按值調用」。 對於引用類型,傳遞的是引用的副本(值),而非引用本身。
public class Swap {
public static void main(String[] args) {
Changer c = new Changer();
// 1. 嘗試交換兩個 String
String stra = "Mighty";
String strb = "Mouse";
c.swap(stra, strb);
System.out.println(stra + " " + strb); // 輸出:Mighty Mouse(未交換)
// 2. 嘗試交換數組元素
String[] strArr = {stra, strb};
c.swap(strArr);
System.out.println(strArr[0] + " " + strArr[1]); // 輸出:Mouse Mighty(交換成功!)
}
static class Changer {
public void swap(T a, T b) { // 傳遞引用副本
T temp = a; a = b; b = temp; // 僅改變局部變量指向
}
public void swap(T[] t) { // 傳遞數組引用副本
if (t.length < 2) return;
T temp = t[0]; t[0] = t[1]; t[1] = temp; // 修改數組內部內容
}
}
}

stra、strb 棧上存儲引用(地址),指向堆上兩個 String 對象。strArr 棧上存儲引用,指向堆上數組對象,數組內部存儲兩個引用指向同兩個 String。stra 的引用值(地址)複製給形參 a,strb 複製給 b。a = b; b = temp; 只是讓局部變量 a、b 指向交換,不影響外部實參 stra、strb。a、b 銷毀,外部引用不變。strArr 的引用值複製給形參 t。兩個引用指向同一數組對象。t[0] = t[1]; t[1] = temp; 通過引用訪問數組內部,**修改了數組對象的內容**。strArr 仍指向同一數組,但內容已變。| 參數類型 | 傳遞內容 | 方法內能否修改實參指向 | 方法內能否修改對象內容 |
|---|---|---|---|
| 基本類型 | 值的副本 | 否 | 不適用 |
| 引用類型 | 引用的副本(地址值) | 否(無法讓實參指向新對象) | 是(通過引用訪問對象內部) |