public class Test {
String str = new String("good");
public static void main(String[] args) {
Test t = new Test();
t.change(t.str);
System.out.print(t.str); // 輸出 "good"
}
public void change(String str) {
str = "test ok"; // 僅修改區域參數引用
}
}
Java 只有傳值呼叫。對於物件參數,傳遞的是「引用的副本」(記憶體地址值)。
str = "test ok" 讓區域變數 str 指向新字串常量 "test ok",原物件 "good" 不受影響。t.str 仍指向原字串 "good"。呼叫前:
t.str ──────► "good" (堆/常量池)
change(str) 參數 str ──────► "good"
執行 str = "test ok" 後:
t.str ──────► "good" (未變)
str ──────► "test ok" (新物件)
public void modify(StringBuilder sb) {
sb.append(" modified"); // 修改物件內容,實參可見
}
// 呼叫
StringBuilder sb = new StringBuilder("good");
modify(sb); // sb 變為 "good modified"
此時傳遞的仍是引用副本,但雙方指向同一個可變物件,透過方法呼叫修改內部狀態會反映到實參。
String 為 不可變 類別,任何「修改」操作都會產生新物件。return "test ok"; 並由呼叫端接收 str = change(str);。