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

Java 繼承核心概念與實戰:從語法到多態的完整指南

     編輯:Java 綜合教學

Java 繼承核心概念與實戰:從語法到多態的完整指南

繼承是物件導向三大特性之一,讓子類別能重用父類別的程式碼,並延伸專屬功能。本文從定義語法、存取權限、方法重載與覆寫、到實戰範例,完整梳理 Java 繼承機制。

一、繼承基本語法

[修飾符] class 子類別名 extends 父類別名 {
    // 子類別主體:新增欄位、方法、建構子、內部類別等
}
  • extends 關鍵字建立「is-a」關係。
  • 父類別封裝共性;子類別擴充個性。
  • 繼承具有傳遞性:子類別可再被繼承,形成多層階層,越上層越抽象,越下層越具體。

二、實戰範例:員工與經理

父類別 Employee

public class Employee {
    private String name;
    private int id;
    private double salary;
    private String department;

    // 建構子、getter/setter、toString() 略
}

子類別 Manager

public class Manager extends Employee {
    private double specialSalary; // 專屬津貼

    public Manager() { super(); }
    public Manager(String name, int id, double salary, String dept, double specialSalary) {
        super(name, id, salary, dept);
        this.specialSalary = specialSalary;
    }
    // getter/setter、toString() 呼叫 super.toString() 略
}

super(...) 必須放在建構子第一行,用於初始化父類別狀態。

三、子類別對父類別成員的存取權限

父類別修飾符同套件子類別不同套件子類別
public✅ 可直接存取✅ 可直接存取
protected✅ 可直接存取✅ 可直接存取
default (package-private)✅ 可直接存取❌ 不可直接存取
private❌ 不可直接存取❌ 不可直接存取

解決方案:透過父類別提供的 public 或 protected 方法(getter/setter)間接存取 private 或 default 成員。

四、方法重載 vs. 覆寫

1. 方法重載

同一類別(或父子類別)中,方法名稱相同但參數列表不同(型別、個數、順序)。

// Employee
public void setInfo(String name, int id, double salary, String dept) { ... }

// Manager 重載:參數多一個 specialSalary
public void setInfo(String name, int id, double salary, String dept, double specialSalary) {
    super(name, id, salary, dept);
    this.specialSalary = specialSalary;
}

2. 方法覆寫

子類別定義與父類別簽名完全相同的方法(回傳型別、方法名、參數列表),實現多態。兩種常見形式:

  1. 擴充型:先呼叫 super.method(),再補充邏輯。
  2. 完全覆寫:不呼叫父方法,完全重寫實作(適用於子類別行為與父類別截然不同)。

經典範例:覆寫 equals() 比較物件內容

Object.equals() 預設比較參考位址。若需比較「內容相等」,需覆寫:

public class ComplexNumber {
    private double re, im;
    // 建構子、getter/setter 略

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        ComplexNumber other = (ComplexNumber) obj;
        return Double.compare(re, other.re) == 0 && Double.compare(im, other.im) == 0;
    }
    // toString()、main() 測試略
}

測試結果:(2.0 + 3.0i) <> (2.0 - 3.4i),正確判定不相等。

五、最佳實踐提醒

  • 覆寫方法時務必加上 @Override 註解,編譯器會協助檢查簽名是否正確。
  • 父類別設計為「被繼承」時,慎用 private 修飾需給子類別用的欄位/方法;優先考慮 protected。
  • 建構子不會被繼承,但子類別建構子必須透過 super() 顯式或隱式呼叫父建構子。
  • 避免過深的繼承層次(超過 3-4 層),改用組合或介面組合提高靈活性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved