首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 字串傳值機制:為什麼方法內修改參數不影響實參

     編輯:程式設計綜合問答

代碼現象

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"

此時傳遞的仍是引用副本,但雙方指向同一個可變物件,透過方法呼叫修改內部狀態會反映到實參。

面試必備總結

  1. Java 無傳引用呼叫,只有傳值(基本型別傳值、引用型別傳引用的值)。
  2. 字串 String 為 不可變 類別,任何「修改」操作都會產生新物件。
  3. 若需在方法中修改呼叫端字串變數,可回傳新字串:return "test ok"; 並由呼叫端接收 str = change(str);。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved