調用方法時,參數傳遞方式直接影響方法內部操作是否影響外部變量。Java 官方文檔明確規定:Java 只有傳值(Call by Value)。但為何許多開發者誤以為對象是傳引用?關鍵在於「傳遞的是對象引用的副本」。
package test;
import java.util.ArrayList;
import java.util.List;
public class ValueAndAddress {
public static void f1(int x) { x = x + 5; }
public static void f2(String s) { s = new String("10000"); }
public static void f3(List<Integer> list) {
list.remove(0); list.remove(1); list.remove(2);
}
public static void main(String[] args) {
int x = 5;
String s = new String("abcdef");
List<Integer> list = new ArrayList<>();
list.add(0); list.add(1); list.add(2); list.add(3); list.add(4);
f1(x); f2(s); f3(list);
System.out.println("x=" + x); // 輸出 5
System.out.println("s=" + s); // 輸出 abcdef
for (int i=0; i<list.size(); i++) {
System.out.println("list[" + i + "]=" + list.get(i)); // 輸出 3,4
}
}
}

Java 永遠是傳值。對於對象,傳遞的是「引用的值(即記憶體地址)」。理解這一點,能避免在集合、自定義對象操作中產生難以排查的 Bug。