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

Java 每日一題(20170210):String 與 char 數組傳參修改行為分析

     編輯:Java 相關知識

題目代碼

package Feb2017;

public class Ques0210 {
    public static void main(String[] args) {
        String str = new String("World");
        char ch[] = {'H', 'e', 'l', 'l', 'o'};
        change(str, ch);
        System.out.println(str + " and " + new String(ch));
    }

    public static void change(String str, char ch[]) {
        str = "Change";
        ch[0] = 'C';
    }
}

問題

主程序輸出結果是什麼?

答案與解析

輸出結果

World and Cello

核心知識點

  1. Java 唯有值傳遞:方法參數傳遞的是變量值的副本
    • 基本類型:傳遞值的副本
    • 引用類型:傳遞引用地址的副本
  2. String 不可變:
    • str = "Change" 只是將方法參數 str(引用副本)指向新字符串對象
    • 原 main 中的 str 仍指向 "World",完全不受影響
  3. 數組是對象,引用傳遞:
    • ch 參數獲得的是數組對象引用的副本
    • ch[0] = 'C' 通過引用修改了同一個數組對象的內容
    • main 中的 ch 看到修改後的內容:{'C','e','l','l','o'}

內存模型圖解

main 調用前:
str ──────► "World" (堆/常量池)
ch  ──────► char[] {'H','e','l','l','o'} (堆)

change 方法執行:
參數 str ──────► "World" (同一對象)
參數 ch  ──────► char[] {'H','e','l','l','o'} (同一數組)

str = "Change":
參數 str ──────► "Change" (新對象,main 中 str 不變)

ch[0] = 'C':
參數 ch ──────► char[] {'C','e','l','l','o'} (同一數組被修改,main 可見)

延伸思考

  1. 若 change 中改為 ch = new char[]{'X'},main 中 ch 會變嗎?不會,同理引用副本重新指向
  2. StringBuilder 可變,若傳入 StringBuilder sb 並 sb.append("X"),main 可見修改
  3. 這是 Java 面試高頻考點,掌握「值傳遞+引用副本」模型是關鍵

參考資料

  • 《Java 核心技術 卷 I》第 4 章 對象與類
  • Java Language Specification, Chapter 8.4.1
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved