public class Aed {
String str = "good";
char[] ch = {'a','b','c'};
int num = 10;
public void change(String str, char[] ch, int num) {
str = "test ok"; // 1. 重新指向新字串物件
ch[0] = 'g'; // 2. 修改陣列內容
num = 20; // 3. 修改區域變數
}
public static void main(String[] args) {
Aed a = new Aed();
a.change(a.str, a.ch, a.num);
System.out.print(a.str); // good
System.out.print(a.ch); // gbc
System.out.print(a.num); // 10
}
}
輸出:good gbc 10 —— 僅陣列 `ch` 的第一個元素變為 `'g'`。
| 參數類型 | 傳遞內容 | 方法內操作 | 對外部影響 |
|---|---|---|---|
| 基本型別 (int, char...) | 數值副本 | 修改區域變數 | 無影響 |
| 參考型別 (String, 陣列, 物件) | 引用副本 (記憶體位址) | 重新指向新物件 (`=`) | 無影響 |
| 參考型別 | 引用副本 | 透過引用修改物件內部狀態 (如 `ch[0]=...`) | 有影響 |
str = "test ok":`str` 參數原本指向 `"good"`,賦值後指向新字串 `"test ok"`,外部 `a.str` 仍指向 `"good"`。ch[0] = 'g':`ch` 參數與外部 `a.ch` 指向同一個陣列物件,透過索引修改內容,外部可見。num = 20:基本型別傳值,修改區域副本,外部 `a.num` 不變。「Java 物件是傳址呼叫」—— 錯誤。Java 傳遞的是引用的副本(值),無法在方法內讓外部引用指向新物件。C++ 的引用參數 (`Type&`) 才是真正的傳址。
包裝在可變容器中:
// 方案 1: 陣列包裝
void modify(int[] wrapper) { wrapper[0] = 20; }
int[] num = {10}; modify(num); // num[0] 變 20
// 方案 2: 自訂可變持有類
class MutableInt { int value; }
void modify(MutableInt mi) { mi.value = 20; }