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

計算機程序思維邏輯(16):Java 繼承與多態進階細節

     編輯:Java 綜合教學

計算機程序思維邏輯(16):Java 繼承與多態進階細節

上期介紹了繼承與多態基礎概念,本期深入探討七大進階細節。

1. 構造方法細節

super 調用規則

子類構造器必須調用父類構造器。若無顯式 super(...),自動調用父類無參構造器。若父類無無參構造器,子類必須顯式調用帶參構造器,否則編譯錯誤。

public class Base {
    private String member;
    public Base(String member) { this.member = member; } // 唯一構造器
}
public class Child extends Base {
    public Child(String member) { super(member); } // 必須顯式調用
}

構造器中調用可重寫方法的陷阱

父類構造器調用可重寫方法時,會觸發多態調用子類方法,但此時子類字段尚未初始化(默認值)。

public class Base {
    public Base() { test(); } // 調用可重寫方法
    public void test() {}
}
public class Child extends Base {
    private int a = 123;
    @Override public void test() { System.out.println(a); }
}
// main: new Child() → 輸出 0(而非 123),再調用 c.test() → 123

最佳實踐:構造器中只調用 private/final/static 方法。

2. 重名與靜態綁定

實例變量、靜態變量、靜態方法、private 方法採用靜態綁定(編譯期根據引用類型決定),非 private 實例方法採用動態綁定(運行期根據對象類型決定)。

Base b = new Child(); Child c = new Child();
b.s → Base.s (靜態綁定)    c.s → Child.s
b.staticTest() → Base      c.staticTest() → Child
b.m → Base.m               c.m → Child.m

3. 重載 vs 重寫

  • 重載:同名、參數簽名不同(個數/類型/順序)
  • 重寫:子類重寫父類相同簽名方法

方法調用解析優先級:先按參數類型匹配度選擇重載版本,再看動態類型進行動態綁定。完全匹配優於兼容匹配;子類同等匹配度下優先。

4. 父子類型轉換

  • 向上轉型:Base b = new Child()(自動,安全)
  • 向下轉型:Child c = (Child) b(需強轉,運行時檢查)

安全判斷:b instanceof Child。只有動態類型為 Child 或其子類時才能轉換成功。

5. protected 訪問控制

  • 同包可見
  • 子類可見(跨包也可見)
  • 外部不可見

模板方法模式典型應用:父類定義算法骨架(public),關鍵步驟交給 protected 方法由子類實現。

public class Base {
    protected int currentStep;
    protected void step1() {} protected void step2() {}
    public void action() { currentStep=1; step1(); currentStep=2; step2(); }
}
public class Child extends Base {
    @Override protected void step1() { println("step " + currentStep); }
    @Override protected void step2() { println("step " + currentStep); }
}

6. 可見性重寫規則

子類重寫方法不能降低父類可見性:

  • 父 public → 子必須 public
  • 父 protected → 子可 protected 或 public

原因:繼承體現 is-a,子類必須支援父類所有對外行為。

7. final 防止繼承/重寫

  • final class:不可被繼承
  • final method:不可被重寫
  • final variable:不可重新賦值

下期將探討:子類對象創建完整過程、動態綁定底層實現原理。關注「老馬說編程」獲取最新文章。

公眾號二維碼

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