Java 只有傳值調用。基本類型傳遞的是值的副本,引用類型傳遞的是引用的副本(指向同一對象)。**無法在方法內直接修改呼叫端的基本類型變量**。
| 語言 | 基本類型 | 引用/指標 |
|---|---|---|
| C | 傳值(副本) | 傳址(指標),可修改原變量 |
| C++ | 傳值 | 引用參數 void f(int& x) 可修改原變量 |
| Java | 傳值(副本) | 傳引用的副本,**不可**修改呼叫端的引用本身,但可修改對象內部狀態 |
// 極不推薦:破壞封裝、效能差、線程不安全
Field f = obj.getClass().getDeclaredField("field");
f.setAccessible(true);
f.setInt(obj, newValue);
int addOne(int x) { return x + 1; }
a = addOne(a); // 呼叫端重新賦值
class IntRef { public int value; }
void addOne(IntRef ref) { ref.value++; }
// 呼叫
IntRef wrapper = new IntRef(); wrapper.value = 5;
addOne(wrapper); // wrapper.value 變 6
void addOne(int[] arr) { arr[0]++; }
int[] a = {5};
addOne(a); // a[0] 變 6
class User { String name; }
void rename(User u, String newName) { u.name = newName; } // 修改對象內容,非引用本身
String, Integer 本身不可變,重新賦值即可)。Result 類或 Map 承載多個返回值。Java 基本類型參數**不可在方法內修改原變量**。這是語言設計決策,帶來更清晰的副作用邊界。改用返回值、可變對象封裝、或修改對象內部狀態來達成同樣目的。