String s = "Hello world!" 宣告了什麼?宣告一個指向 String 物件的引用變數,名為 s,目前指向常量池中的 "Hello world!" 物件。並未宣告物件本身。String s2 = s; 只是複製引用,雙方指向同一物件,無新物件產生。
== vs equals()== 比較變數值 (基本型別比值,引用型別比記憶體地址)。new String("foo") 會在堆中建立兩個不同地址的物件,== 為 false。equals() 比較物件內容。Object 默認實現為 ==,需子類覆寫 (如 String 比內容)。使用集合類 (HashMap/Set) 必須確認 equals 邏輯。不可變。s = s + " world!" 實際產生新物件 "Hello world!",s 改指向新物件,舊物件 "Hello" 留在記憶體待 GC。頻繁修改字串請用 StringBuffer/StringBuilder。常量池機制:字面量相同共用物件,new String() 強制新建。
final 修飾了什麼?final StringBuffer sb = new StringBuffer(); sb.append("x"); // OK,sb = new StringBuffer(); // 編譯錯誤。final 無法保證物件狀態不變,錯誤用法:以為 final 就線程安全。| 類型 | 規則 |
|---|---|
| 類屬性 (Instance/Static) | JVM 自動初始化 (0/false/null),Static 隨類載入一次,Instance 隨 new 每次。 |
| 區域變數 | 必須顯式初始化,編譯器強制檢查 (含 try/if 分支覆蓋檢查)。 |
| 方法參數 | 調用者傳值即初始化,無需額外賦值。 |
instanceof 是什麼?二元運算符,測試左側物件是否為右側類/介面實例。String s = ""; s instanceof Object // true。濫用 instanceof 違反多態,應用方法重載/覆寫替代 (如 calculate(PhoneBill)/calculate(GasBill))。