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

Java 基礎教程:繼承機制深度解析與 protected 訪問控制

     編輯:Java 程式設計入門

繼承是面向對象「is-a」關係的代碼體現,配合組合「has-a」,構成復用雙引擎。本文從類繼承、訪問控制、方法覆蓋、構造鏈四大維度,構建完整繼承知識體系。

繼承基礎:extends 關鍵字

class Human {
    private int height;
    public Human(int h) { this.height = h; }
    public int getHeight() { return height; }
    public void growHeight(int h) { height += h; }
    public void breath() { System.out.println("hu...hu..."); }
}

class Woman extends Human { // 繼承 Human
    public Human giveBirth() { // 新增方法
        System.out.println("Give birth");
        return new Human(20);
    }
}

繼承關係:箭頭指向基類

  • 基類:Human,被繼承類。
  • 衍生類:Woman,繼承類,自動擁有基類所有 public/protected 成員。
  • 單繼承:Java 類僅能繼承一個直接父類,但可多層繼承(A → B → C)。

三層視角:基類定義、衍生類定義、外部使用

外部視角:統一接口

外部使用者看到的是合併後的公共接口,無感知內部繼承結構。

衍生類開發者需理解內存佈局:

基類對象 + 衍生層 = 衍生對象

  • 創建衍生對象時,**先構造基類對象(子對象),再構建衍生層**。
  • 基類 private 成員存在但不可直接訪問,只能通過基類 public/protected 方法間接操作。
  • 衍生層訪問基類 public/protected 成員用 super.member,調用基類構造用 super(args)。

protected:給子類的特權通道

設計意圖:基類預留擴展點給子類,但對包外非子類隱藏。典型用法:

  • 基類定義 protected void onDataLoaded() {},子類覆寫掛鉤業務邏輯(模板方法模式)。
  • 基類暴露 protected Logger logger,子類直接用日誌,外部不可見。

方法覆蓋:多態的運行時分派

class Woman extends Human {
    @Override
    public void breath() { // 覆蓋基類方法
        super.breath(); // 可選:調用基類版本
        System.out.println("su...su..."); // 女性特有呼吸聲
    }
}

覆蓋規則:

  1. 方法簽名(名+參數列表)完全一致。
  2. 返回類型兼容(协变返回:子類型可替換父類型)。
  3. 拋出異常範圍不大於基類(可少拋、拋子類異常)。
  4. 訪問權限不低於基類(可放寬,不可收窄)。
  5. final/static/private 方法不可覆蓋。

外部調用 woman.breath() 執行衍生類版本,實現動態綁定。

構造鏈:super() 必須首行

class Woman extends Human {
    public Woman(int h) {
        super(h); // 必須第一行顯式調用基類構造,否則隱式調用 super()
        System.out.println("Hello, Pandora!");
    }
}

基類無無參構造時,衍生類必須顯式 super(args) 指定調用哪個基類構造。

繼承設計鐵律:里氏替換原則(LSP)—— 衍生類對象必須能無縫替換基類對象,不破壞基類契約。濫用繼承導致脆弱基類問題,**優先組合,謹慎繼承**,僅當明確滿足 is-a 且行為可替換時使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
修飾符同類同包子類(異包)任意處
private✓✗✗✗
default✓✓✗✗
protected✓✓✓✗
public✓✓✓✓