今天我們來分析一道經典的 Java 基礎題目,考察點直擊 final 關鍵字修飾引用類型變量的核心語義。很多初學者(甚至有經驗的開發者)容易混淆「引用不可變」與「對象內容不可變」的區別。
package Jan2017;
public class Ques0111 {
public static void main(String[] args){
final Person p1 = new Person("張三");
final Person p2 = new Person("李四");
p1 = new Person("王五"); // 第 1 行
p2.setName("王五"); // 第 2 行
}
}
class Person {
private String name;
Person(String name) { this.name = name; }
public void setName(String name) { this.name = name; }
}
請問主程序有無編譯錯誤?若有,錯在哪一行?
答案:有編譯錯誤,錯在第 1 行:`p1 = new Person("王五");`
final 鎖的是「門牌號」,不是「屋裡的人」。
引用變量是門牌號,對象是房子。final 禁止換門牌號,但允許裝修房子(修改屬性)。
若需 `Person` 對象不可變,需滿足:
這就是《Effective Java》中提倡的不可變對象設計模式,線程安全、簡單可靠。
20170110 題目解析請點擊文末鏈接或關注微信公眾號「weknow619」查看。weknow 團隊已開通分答,歡迎來咨詢交流!