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

Java 類構造器深度解析:繼承鏈調用規則與 super 關鍵字實戰

     編輯:Java 綜合教學

核心結論先行

  1. 構造器不被繼承:子類無法直接使用父類構造器,必須自行定義。
  2. 子類構造器首行必須調用父類構造器:顯式 super(...) 或隱式 super()(無參)。
  3. 父類無無參構造器時,子類必須顯式調用帶參 super(...),否則編譯報錯。

代碼實驗:InheritanceDemo

public class InheritanceDemo {
    public static void main(String[] args) {
        // SubClass sc = new SubClass(); // 若父類無無參構造器,這行編譯錯誤
        SubClass sc2 = new SubClass(200);
        sc2.eat();
    }

    static class SuperClass {
        private int n;

        SuperClass() {
            System.out.println("SuperClass() 無參構造器");
        }

        SuperClass(int n) {
            System.out.println("SuperClass(int n): " + n);
            this.n = n;
        }

        void eat() { System.out.println("SuperClass eat"); }
    }

    static class SubClass extends SuperClass {
        private int n;

        SubClass() {
            // super(300); // 若父類無無參構造器,必須取消註釋顯式調用
            System.out.println("SubClass() 無參構造器");
        }

        SubClass(int n) {
            // super(300); // 同理
            System.out.println("SubClass(int n): " + n);
            this.n = n;
        }
    }
}

運行輸出分析

SuperClass(int n): 200
SubClass(int n): 200

調用 new SubClass(200) 時:

  1. 子類構造器 SubClass(int n) 首行隱式調用 super()(因父類有無參構造器)
  2. 父類 SuperClass() 執行,打印無參信息
  3. 返回子類構造器繼續執行,打印子類信息

若父類移除無參構造器,子類構造器必須首行寫 super(參數),否則編譯錯誤:Implicit super constructor SuperClass() is undefined. Must explicitly invoke another constructor。

內存佈局與執行順序圖解

new SubClass(200)
│
├─ 1. 分配 SubClass 對象內存(含繼承自 SuperClass 的字段 n)
│
├─ 2. 默認初始化:所有字段賦 0/null/false
│
├─ 3. 執行父類構造器鏈
│   ├─ SuperClass() / SuperClass(int n)  ← 此處決定調用哪個
│   ├─ 父類字段顯式初始化 / 實例初始化塊
│   └─ 父類構造器體代碼
│
├─ 4. 子類字段顯式初始化 / 實例初始化塊
│
└─ 5. 子類構造器體代碼執行完畢,返回引用

常見誤區與最佳實踐

誤區正確認知
子類繼承了父類構造器構造器非成員,不參與繼承;子類通過 super 調用父類構造邏輯
super() 可以寫在構造器任意位置必須是構造器第一條語句,前面不能有任何代碼
this() 和 super() 可以共存互斥,二選一,且必須首行
父類無無參構造器,子類不寫構造器也能編譯子類隱式無參構造器會調用 super(),編譯失敗

設計建議

  1. 父類保留無參構造器(即使空實現),降低子類耦合,符合「開閉原則」。
  2. 構造器參數傳遞:子類構造器接收參數,部分透傳給 super(...),部分初始化自身字段。
  3. 不可變對象構建:構造器初始化所有 final 字段,無 setter,線程安全。
  4. 構造器中避免調用可覆寫方法:父類構造器調用的方法被子類覆寫時,子類字段尚未初始化,導致 NPE 或邏輯錯誤。

掌握構造器調用鏈,是寫出健壯繼承體系、避免「脆弱基類問題」的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved