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

Java 入門教學 (15):抽象類與抽象方法 - 規範子類共同行為的藍圖

     編輯:Java 相關知識

為什麼需要抽象類?

員工管理系統: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);
}

鐵律:

  1. 含 abstract 方法的類 必須 宣告 abstract class。
  2. abstract class 可 無 抽象方法 (單純禁止實例化)。
  3. 子類繼承抽象類,必須實作所有抽象方法,否則子類也得宣告 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();       // 共用父類方法
}

抽象類 vs 介面:補充比較 (承接第 16 課)

特性抽象類介面
建構子可有 (供子類 super)不可有
實例欄位可有 (狀態)僅常數
方法實作可混合抽象/具體Java 7 全抽象;Java 8+ 可 default/static
繼承關係單一繼承 (extends 一個)多實作 (implements 多個)
適用語意is-a 核心身分 (Employee)has-a 能力 (Flyer, Serializable)

設計模式連結:Template Method

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 = 無主體、強制子類實作,定義「必須有此行為」。
  • 抽象類是 is-a 階層核心;介面是 has-a 能力擴展。
  • 善用 Template Method 模式,將不變流程留在父類,變化點交給子類。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved