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

Java 繼承機制詳解:extends 關鍵字、super 調用父構造器、方法重寫與多態實戰

     編輯:Java 綜合教學

前言

繼承是面向對象三大特性之一,實現代碼復用與多態基礎。本文通過 Employee / Manager 經典案例,深度講解 extends 關鍵字、super 調用父構造器、方法重寫規則、向上轉型與動態分派機制。

一、核心代碼案例

1. 父類 Employee

import java.util.Date;
import java.util.GregorianCalendar;

public class Employee {
    private String name;
    private double salary;
    private Date hireDay;

    public Employee(String name, double salary, int year, int month, int day) {
        this.name = name;
        this.salary = salary;
        GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
        this.hireDay = calendar.getTime();
    }

    public String getName() { return name; }
    public double getSalary() { return salary; }
    public Date getHireDay() { return hireDay; }

    public void raiseSalary(double byPercent) {
        double raise = salary * byPercent / 100;
        salary += raise;
    }
}

2. 子類 Manager

public class Manager extends Employee {
    private double bonus;

    // 子類構造器必須調用父類構造器
    public Manager(String name, double salary, int year, int month, int day) {
        super(name, salary, year, month, day); // 必須是第一句
        this.bonus = 0;
    }

    public void setBonus(double bonus) { this.bonus = bonus; }

    // 重寫 getSalary:基礎薪資 + 獎金
    @Override
    public double getSalary() {
        double baseSalary = super.getSalary(); // 調用父類實現
        return baseSalary + bonus;
    }
}

3. 測試類:向上轉型與多態

public class TestInheritance {
    public static void main(String[] args) {
        Manager boss = new Manager("Boss", 80000, 1987, 12, 15);
        boss.setBonus(5000);

        Employee[] staff = new Employee[3];
        staff[0] = boss;                    // 向上轉型:Manager → Employee
        staff[1] = new Employee("Emp1", 50000, 1989, 10, 1);
        staff[2] = new Employee("Emp2", 40000, 1990, 3, 15);

        // 多態:同樣調用 getSalary(),運行期根據實際對象類型分派
        for (Employee e : staff) {
            System.out.println("name=" + e.getName() + ", salary=" + e.getSalary());
        }
        /* 輸出:
        name=Boss, salary=85000.0   (80000 + 5000 bonus)
        name=Emp1, salary=50000.0
        name=Emp2, salary=40000.0
        */
    }
}

二、關鍵知識點深度解析

1. extends 關鍵字

  • 聲明繼承關係:class Child extends Parent
  • 子類獲得父類 非 private 字段、方法、嵌套類
  • Java 單繼承:只能 extends 一個父類,但可 implements 多個接口
  • 所有類隱式繼承 java.lang.Object

2. super 關鍵字三大用法

用法語法場景規則
調用父構造器super(args)子類構造器首行必須第一句;無則隱式 super() 調用父無參構造
調用父類方法super.method()重寫中復用父邏輯可在任意非靜態方法中使用
訪問父類字段super.field子類同名字段遮蔽時較少用,建議避免同名字段

3. 構造器鏈機制

new Manager("Boss", 80000, 1987, 12, 15)
    → Manager 構造器
        → super(name, salary, year, month, day)  // 顯式調用
            → Employee 構造器初始化 name, salary, hireDay
        → Manager 初始化 bonus = 0
    → 返回 Manager 實例

鐵律:子類構造器必須直接或間接調用父類構造器,否則編譯錯誤。

4. 方法重寫規則

  • 簽名相同:方法名、參數列表完全一致
  • 返回類型兼容:可為子類型(協變返回類型)
  • 權限不低於父類:protected → public ✅,public → protected ❌
  • 拋出異常不寬於父類:子類可少拋、拋子類異常
  • @Override 註解:編譯期驗證是否真正重寫,防止拼寫錯誤
  • final 方法不可重寫,private 方法不可見故不存在重寫

5. 多態與動態分派

Employee e = new Manager(); // 向上轉型
e.getSalary(); // 編譯期看 Employee.getSalary,運行期調用 Manager.getSalary
  • 編譯期綁定:靜態方法、私有方法、構造器、final 方法
  • 運行期綁定:非 final 實例方法(動態分派)
  • 字段無多態:e.field 總是訪問聲明類型的字段

三、繼承設計最佳實踐

  1. is-a 關係:Manager is-a Employee ✅;Car is-a Engine ❌(組合)
  2. 父類通用、子類特化:共同屬性/方法上移,特有下推
  3. 優先組合、接口代替繼承:降低耦合,避免繼承層次過深
  4. 模板方法模式:父類定義算法骨架,子類實現具體步驟
  5. 文檔化繼承契約:明確哪些方法允許/預期重寫

四、常見誤區

誤區正確理解
子類繼承父類私有字段私有字段不可見,但通過父類 public/protected 方法間接訪問
構造器可繼承構造器不繼承,子類必須自行定義並調用 super()
靜態方法可重寫靜態方法隱藏,非重寫,無多態
向下轉型無風險需 instanceof 守衛,否則 ClassCastException

五、總結

  • extends 建立繼承,子類擴展父類功能
  • super() 調用父構造器必須在子構造器首行
  • 重寫實現多態,配合 @Override 保證正確性
  • 向上轉型安全,向下轉型需 instanceof
  • 設計原則:is-a 關係、組合優於繼承、文檔化契約
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved