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

Java 抽象類別核心要點與實戰範例 (abstract class)

     編輯:Java 相關知識

abstract 關鍵字可修飾類別與方法。抽象類**無法實例化**,旨在定義「契約」與「共享實作」,供子類繼承具體化。良好的抽象類設計遵循「模板方法模式」與「里氏替換原則」。

核心規則速記

  • 含 abstract 方法的類**必須**宣告為 abstract class。
  • abstract class 可**無**抽象方法 (純作為不可實例化的基類)。
  • 抽象類可包含**建構子**、**非抽象方法**、**欄位**、**靜態方法**、**巢狀類別**。
  • 子類**必須**實作所有繼承的抽象方法,除非子類也宣告為 abstract。
  • 抽象方法**不能**為 private、final、static (JDK 8+ 可有 static 預設方法,但非抽象)。

完整範例:薪資系統雛形


import java.time.LocalDate;
import java.util.*;

// 抽象基類
abstract class Employee {
    private final String name;
    private final LocalDate hireDate;

    protected Employee(String name, LocalDate hireDate) {
        this.name = name;
        this.hireDate = hireDate;
    }

    public String getName() { return name; }
    public LocalDate getHireDate() { return hireDate; }

    // 抽象方法:強制子類實作薪資計算邏輯
    public abstract double monthlySalary();

    // 具體方法:共享邏輯 (模板方法)
    public final String salarySlip() {
        return String.format("%s | 入職: %s | 月薪: %.2f", name, hireDate, monthlySalary());
    }
}

// 具體子類:月薪制
class SalariedEmployee extends Employee {
    private final double monthlyPay;
    SalariedEmployee(String name, LocalDate hireDate, double monthlyPay) {
        super(name, hireDate);
        this.monthlyPay = monthlyPay;
    }
    @Override public double monthlySalary() { return monthlyPay; }
}

// 具體子類:時薪制
class HourlyEmployee extends Employee {
    private final double hourlyRate;
    private final int hoursPerMonth;
    HourlyEmployee(String name, LocalDate hireDate, double rate, int hours) {
        super(name, hireDate);
        this.hourlyRate = rate; this.hoursPerMonth = hours;
    }
    @Override public double monthlySalary() { return hourlyRate * hoursPerMonth; }
}

// 測試
public class AbstractDemo {
    public static void main(String[] args) {
        List<Employee> staff = Arrays.asList(
            new SalariedEmployee("Alice", LocalDate.of(2020, 3, 1), 80000),
            new HourlyEmployee("Bob", LocalDate.of(2021, 7, 15), 300, 160)
        );
        for (Employee e : staff) {
            System.out.println(e.salarySlip());
        }
    }
}

輸出


Alice | 入職: 2020-03-01 | 月薪: 80000.00
Bob   | 入職: 2021-07-15 | 月薪: 48000.00

抽象類 vs 介面 選型指南 (JDK 8+)

維度abstract classinterface
狀態 (欄位)可有 instance fields僅 static final 常數
建構子可有無
方法實作任意default/static (JDK 8+)
多重實作單一繼承多重實作
演進相容性新增非抽象方法不破壞子類新增 default 方法不破壞實作類
適用場景「是一種」關係、共享狀態/邏輯「能做什麼」能力、多型契約

設計原則

  1. 優先用介面 定義類型契約,保持鬆耦合。
  2. 需要**共享程式碼/狀態**時,提供 abstract class 作為骨架實作 (如 AbstractList, HttpServlet)。
  3. 避免「神類」抽象類:職責單一,僅封裝真正共用的核心邏輯。
  4. 建構子勿呼叫可被覆寫的方法 (防止子類欄位未初始化就被使用)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved