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

Java 建構子深度解析:繼承鏈調用、私有建構子模式與單例實作

     編輯:Java 相關知識

建構子調用鐵律

  1. 由父至子:多層繼承時,從繼承樹最頂層父類開始,依序執行各類別建構子,確保所有繼承欄位正確初始化。
  2. 隱含 super():子類建構子首行若無明確 super(...),編譯器自動插入無參數 super()。
  3. 編譯期檢查:父類若無無參數建構子 (含預設建構子被覆寫),子類 必須 顯式呼叫父類帶參數建構子,否則編譯失敗。

編譯錯誤經典案例

public class Grapha {
    public Grapha(String name) { System.out.println("Grapha(String)"); }
    // 無無參數建構子
}
class Father extends Grapha {
    public Father() { } // 編譯錯誤:implicit super constructor Grapha() is undefined
    public Father(String name) { } // 編譯錯誤:同上
}

修正方式:在 Father 每個建構子首行加上 super("someName"),或在 Grapha 補上無參數建構子。

私有建構子的設計模式應用

模式私有建構子用途關鍵點
Singleton (單例)阻止外部 new,靜態工廠方法回傳唯一實例雙重檢查鎖定、Enum 實作 (最簡潔、防序列化破壞)
Enum 類別語言層面保證單例、防反射攻擊public enum Singleton { INSTANCE; }
工廠方法 / 靜態工廠封裝複雜建構邏輯、回傳快取/子類實例Boolean.valueOf(true) 回傳快取常量
不可變類別配合 final 欄位、無 setter,建構子一次性初始化String、LocalDate、BigInteger 等
Utility 類別純靜態方法,不需實例化Collections、Math、Arrays

實作範例:執行緒安全單例 (雙重檢查鎖定 + volatile)

public final class Singleton {
    private static volatile Singleton INSTANCE;
    private Singleton() { /* 複雜初始化 */ }
    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) INSTANCE = new Singleton();
            }
        }
        return INSTANCE;
    }
}

最佳實務清單

  • 建構子保持簡單,避免執行可被覆寫的方法 (洩漏 this 引用)。
  • 不可變類別優先使用 final 類別 + final 欄位 + 私有建構子/靜態工廠。
  • 繼承設計時,文檔清楚說明哪些建構子為「指定建構子」供子類呼叫。
  • 善用 @SuppressWarnings("unused") 標註刻意保留的私有建構子,避免靜態分析誤報。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved