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

Java 面試經典:解析「good and abc」輸出背後的值傳遞機制

     編輯:Java 綜合教學

題目回顧

public class Example {
    String str = new String("good");
    char[] ch = {'a', 'b', 'c'};

    public static void main(String args[]) {
        Example ex = new Example();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }

    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'g';
    }
}

執行結果: good and gbc

疑問:為什麼 str 沒變,而 ch 卻改變了?

核心結論:Java 唯有「值傳遞」

Java 中方法參數傳遞永遠是值傳遞。但「值」的含義因類型而異:

  • 基本類型:傳遞的是數值本身的副本。
  • 引用類型:傳遞的是引用(記憶體地址)的副本,而非對象本身。

記憶體演變圖解

1. 執行 Example ex = new Example(); 後

  • 堆中創建 Example 對象,包含兩個實例字段:
    • str → 指向字符串對象 "good"(常量池/堆)
    • ch → 指向字符數組對象 {'a','b','c'}
  • 棧中 ex 變量持有該對象引用。

2. 調用 ex.change(ex.str, ex.ch) 進入方法

  • 形參 str 複製了實參 ex.str 的引用值(指向 "good")。
  • 形參 ch 複製了實參 ex.ch 的引用值(指向同一數組對象)。
  • 此時:兩個引用指向同一對象。

3. 執行 str = "test ok";

  • 在常量池/堆創建新字符串 "test ok"。
  • 形參 str 的引用指向新對象。
  • 實參 ex.str 仍指向原 "good",完全不受影響。

4. 執行 ch[0] = 'g';

  • 形參 ch 仍指向原數組對象。
  • 通過引用修改數組內容:索引 0 處由 'a' 改為 'g'。
  • 實參 ex.ch 指向同一數組,故外部可見變化。

關鍵點總結

操作形參引用實參引用對象內容外部可見性
str = "test ok"指向新對象不變舊對象不變不可見
ch[0] = 'g'不變不變共同指向的數組被修改可見

避坑指南

  • 若想在方法內修改字符串並反映到外部,可使用 StringBuilder 或返回新字符串供調用者重新賦值。
  • 集合/數組作為參數時,方法內對元素的增刪改會影響外部;但對引用變量本身重新賦值(如 list = new ArrayList())則不會。

延伸思考

這道題考察的核心是「引用傳值」而非「引用傳遞」。理解記憶體模型(棧、堆、常量池)與引用副本機制,是攻克 Java 參數傳遞難題的鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved