培訓中心員工系統:Trainer (講師) 與 Sales (業務) 都有「姓名、薪資」,邏輯重複。若各自定義,修改薪資計算需改兩處。繼承讓我們抽取共同點到父類,子類自動擁有父類非私有成員,實現程式碼重用。
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;
// ...
}
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 變數。這是繼承的語意核心。
extends,預設繼承 java.lang.Object (萬物之父)。implements 介面可突破單一繼承限制 (見第 16 課)。| 父類修飾詞 | 子類同包 | 子類不同包 | 說明 |
|---|---|---|---|
| public | ✓ 可見 | ✓ 可見 | 完全繼承 |
| protected | ✓ 可見 | ✓ 可見 | 跨包仍可見 |
| default (無修飾詞) | ✓ 可見 | ✗ 不可見 | 僅同包繼承 |
| private | ✗ 不可見 | ✗ 不可見 | 不繼承,只能透過公共 getter/setter 存取 |
子類建構子第一行必須呼叫 super(...) (見第 13 課)。父類私有欄位透過 super(參數) 初始化。
class Employee {
public void work() { System.out.println("一般工作"); }
}
class Trainer extends Employee {
@Override
public void work() { System.out.println("授課中..."); } // 覆寫
}
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
extends + 單一繼承 + is-a 關係。super() 初始化父類部分。