員工管理系統:Employee (共同屬性:姓名、薪資)、Trainer (講師,額外:授課領域)、Sales (業務,額外:業績)。
若 Employee e = new Employee() 合法,系統會出現「純粹的 Employee」——現實不存在。解法:宣告 abstract class Employee 禁止實例化。
public abstract class Employee {
private String name;
private double salary;
public Employee() {} // 抽象類可有建構子,供子類 super() 呼叫
public Employee(String name, double salary) { this.name = name; this.salary = salary; }
// 一般方法:共用邏輯
public void printInfo() { System.out.println(name + " : " + salary); }
// 抽象方法:強制子類實作,無方法主體
public abstract void adjustSalary(double rate);
}
鐵律:
abstract 方法的類 必須 宣告 abstract class。abstract class 可 無 抽象方法 (單純禁止實例化)。abstract。public class Trainer extends Employee {
private String specialty;
@Override
public void adjustSalary(double rate) {
this.salary = this.salary * (1 + rate * 0.5); // 講師漲幅較小
}
}
public class Sales extends Employee {
private double target;
@Override
public void adjustSalary(double rate) {
this.salary = this.salary * (1 + rate * 2); // 業務漲幅雙倍
}
}
List team = new ArrayList<>();
team.add(new Trainer("Alice", 50000, "Java"));
team.add(new Sales("Bob", 40000, 1000000));
for (Employee e : team) {
e.adjustSalary(0.1); // 同一行程式碼,執行不同邏輯
e.printInfo(); // 共用父類方法
}
| 特性 | 抽象類 | 介面 |
|---|---|---|
| 建構子 | 可有 (供子類 super) | 不可有 |
| 實例欄位 | 可有 (狀態) | 僅常數 |
| 方法實作 | 可混合抽象/具體 | Java 7 全抽象;Java 8+ 可 default/static |
| 繼承關係 | 單一繼承 (extends 一個) | 多實作 (implements 多個) |
| 適用語意 | is-a 核心身分 (Employee) | has-a 能力 (Flyer, Serializable) |
public abstract class DataProcessor {
// 定義演算法骨架
public final void process() {
readData();
doProcess(); // 抽象步驟,子類實作
writeResult();
}
protected void readData() { /* 共用讀取邏輯 */ }
protected void writeResult() { /* 共用寫入邏輯 */ }
protected abstract void doProcess(); // 核心差異點
}
public class CsvProcessor extends DataProcessor {
@Override protected void doProcess() { /* CSV 解析邏輯 */ }
}
public class JsonProcessor extends DataProcessor {
@Override protected void doProcess() { /* JSON 解析邏輯 */ }
}
抽象類鎖定流程,子類填空,完美體現「好萊塢原則:別調用我們,我們會調用你」。
abstract class = 不可實例化的類,可攜帶狀態與共用邏輯。abstract method = 無主體、強制子類實作,定義「必須有此行為」。