類復用是物件導向的基石。本文系統梳理 toString()、繼承語法、構造器鏈、try-finally、protected、向上轉型、final 語義、類加載初始化順序等核心知識點。
所有非基本類型繼承自 Object,擁有 toString()。編譯器在字符串上下文需物件時自動調用。覆寫它可提供有意義的狀態描述。
Object,除非顯式 extends 其他類。super.method() 顯式調用父類實現,構造器中 super(...) 必須首行調用父構造器。super(args)。try {
// 受保護區域,可能拋出異常、return、break
} finally {
// 無論 try 如何退出,必定執行(除非 System.exit/崩潰)
}
適用於關閉流、釋放鎖、清理臨時資源。
protected = package-private + 子類存取權。封裝內部細節,同時允許子類擴展。
Instrument.tune(new Wind()); // Wind → Instrument 自動向上轉型
static void tune(Instrument i) { i.play(); } // 動態綁定調用 Wind.play()
「子類是父類的一種」——里氏替換原則的直觀體現。
判斷標準:是否必須向上轉型? 必須 → 繼承;否則優先組合(new/has-a),降低耦合,提升靈活性。
| 場景 | 含義 | 示例 |
|---|---|---|
| 基本類型變量 | 編譯期常量,必須初始化 | final int MAX = 100; |
| 引用變量 | 引用不可變,物件內容可變 | final List list = new ArrayList(); |
| 方法 | 禁止覆寫,隱含 inline 優化 | final void critical() {} |
| 類 | 禁止繼承 | final class Immutable {} |
| 參數 | 方法內不可重新賦值引用 | void m(final String s) {} |
| 空白 final | 聲明時不賦值,構造器中必須初始化 | final int id; {id = generateId();} |
掌握順序,避免 static 循環依賴、字段未初始化被讀取等陷阱。