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 String str | final StringBuffer sb |
|---|---|---|
| final 限制的內容 | 引用地址(不能指向新對象) | 引用地址(不能指向新對象) |
| 對象內部狀態 | 不可變(String 本身不可變) | 可變(StringBuffer 線程安全可變) |
| 允許的操作 | 無法重新賦值 | 可調用 append、insert 等修改內容 |
| 本題行為 | ❌ 編譯報錯 | ✅ 正常執行 |
final 修飾引用,鎖定的是「地址」而非「內容」。
String 不可變,final 鎖死引用等於鎖死值;
StringBuffer 可變,final 只防換對象,不防改內容。
str = "1234" 註釋掉,輸出為:123
1234StringBuilder 同理,final 只限制引用重新賦值這道題精準考察了 Java 核心基礎中「引用傳遞」與「不可變對象」的理解深度,是初中級面試必考點。