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

Java 入門教學 (12):繼承核心概念 - is-a 關係、單一繼承與程式碼重用

     編輯:Java 相關知識

繼承解決什麼問題?

培訓中心員工系統:Trainer (講師) 與 Sales (業務) 都有「姓名、薪資」,邏輯重複。若各自定義,修改薪資計算需改兩處。繼承讓我們抽取共同點到父類,子類自動擁有父類非私有成員,實現程式碼重用。

關鍵字:extends

public class Employee {           // 父類 / 超類 / 基類
    private String name;
    private double salary;
    // 建構子、getter/setter 略
}

public class Trainer extends Employee { // 子類 / 派生類
    private String course;
    // 自己的建構子、getter/setter
}

public class Sales extends Employee {
    private double target;
    // ...
}

is-a 關係:子類型即父類型

Employee e1 = new Trainer("Alice", 50000, "Java"); // 合法
Employee e2 = new Sales("Bob", 40000, 1000000);    // 合法

// 多型:統一當 Employee 處理
List all = Arrays.asList(e1, e2);
for (Employee e : all) {
    System.out.println(e.getName() + " 薪資:" + e.getSalary());
}

Trainer 是一個 Employee,所以 Trainer 物件可指派給 Employee 變數。這是繼承的語意核心。

Java 單一繼承鐵律

  • 一個類別只能 extends 一個父類。
  • 若未寫 extends,預設繼承 java.lang.Object (萬物之父)。
  • 透過 implements 介面可突破單一繼承限制 (見第 16 課)。

存取權限與繼承

父類修飾詞子類同包子類不同包說明
public✓ 可見✓ 可見完全繼承
protected✓ 可見✓ 可見跨包仍可見
default (無修飾詞)✓ 可見✗ 不可見僅同包繼承
private✗ 不可見✗ 不可見不繼承,只能透過公共 getter/setter 存取

建構子不繼承,但必須鏈式呼叫

子類建構子第一行必須呼叫 super(...) (見第 13 課)。父類私有欄位透過 super(參數) 初始化。

方法覆寫:子類特化父類行為 (見第 14 課)

class Employee {
    public void work() { System.out.println("一般工作"); }
}
class Trainer extends Employee {
    @Override
    public void work() { System.out.println("授課中..."); } // 覆寫
}

完整範例:Employee / Trainer / Sales

package com.csst.inherit;

public class Employee {
    private String name;
    private double salary;
    public Employee() {}
    public Employee(String name, double salary) { this.name = name; this.salary = salary; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getSalary() { return salary; }
    public void setSalary(double salary) { this.salary = salary; }
}

public class Trainer extends Employee {
    private String course;
    public Trainer() {}
    public Trainer(String name, double salary, String course) {
        super(name, salary); this.course = course;
    }
    public String getCourse() { return course; }
    public void setCourse(String course) { this.course = course; }
}

public class Sales extends Employee {
    private double target;
    public Sales() {}
    public Sales(String name, double salary, double target) {
        super(name, salary); this.target = target;
    }
    public double getTarget() { return target; }
    public void setTarget(double target) { this.target = target; }
}

public class TestEmployee {
    public static void main(String[] args) {
        Sales s = new Sales("Kate", 3000, 100000);
        Trainer t = new Trainer("Rose", 3000, "Java");
        System.out.println("Sales: " + s.getName() + " " + s.getSalary() + " " + s.getTarget());
        System.out.println("Trainer: " + t.getName() + " " + t.getSalary() + " " + t.getCourse());
    }
}

輸出

Sales: Kate 3000.0 100000.0
Trainer: Rose 3000.0 Java

繼承設計三原則

  1. is-a 測試:只有「B 是一種 A」才用繼承;單純想重用程式碼請用組合。
  2. 里氏替換原則 (LSP):子類物件必須能無縫替換父類物件,不破壞父類契約。
  3. 開放封閉原則 (OCP):對擴充開放 (新增子類),對修改關閉 (不動父類核心邏輯)。

總結

  • 繼承 = extends + 單一繼承 + is-a 關係。
  • 子類自動擁有父類非私有欄位/方法,可覆寫行為實現多型。
  • 建構子不繼承,但必須鏈式 super() 初始化父類部分。
  • 善用存取修飾詞控制繼承可見性,遵循 is-a/LSP/OCP 設計良好階層。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved