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

【Java 每日一題】final 關鍵字對 String 與 StringBuffer 的不同影響

     編輯:Java 綜合教學

題目代碼

public class Ques1129 {
    public static void main(String[] args) {
        final String str = "123";
        str = "1234";          // 編譯錯誤
        System.out.println(str);

        final StringBuffer sb = new StringBuffer("123");
        sb.append("4");        // 運行正常
        System.out.println(sb);
    }
}

問題

請問主程序的輸出結果是什麼?

答案與解析

❌ 編譯失敗,無輸出結果

代碼第 5 行 str = "1234"; 會導致編譯錯誤:

錯誤信息:variable str might already have been assigned 或 cannot assign a value to final variable str

核心知識點:final 修飾引用類型的語義

維度final String strfinal StringBuffer sb
final 限制的內容引用地址(不能指向新對象)引用地址(不能指向新對象)
對象內部狀態不可變(String 本身不可變)可變(StringBuffer 線程安全可變)
允許的操作無法重新賦值可調用 append、insert 等修改內容
本題行為❌ 編譯報錯✅ 正常執行

記憶口訣

final 修飾引用,鎖定的是「地址」而非「內容」。
String 不可變,final 鎖死引用等於鎖死值;
StringBuffer 可變,final 只防換對象,不防改內容。

延伸思考

  1. 若將 str = "1234" 註釋掉,輸出為:
    123
    1234
  2. StringBuilder 同理,final 只限制引用重新賦值
  3. 實際開發中,盡量對不需要重新賦值的引用加 final,提升代碼可讀性並讓編譯器優化

相關面試高頻追問

  • final 修飾基本類型 vs 引用類型的區別?
  • String 為什麼設計為不可變?(安全性、字符串池、哈希值緩存、線程安全)
  • StringBuffer vs StringBuilder 選型依據?

這道題精準考察了 Java 核心基礎中「引用傳遞」與「不可變對象」的理解深度,是初中級面試必考點。

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