當一個類不包含足夠信息描述具體對象時(如「水果」只有質量體積共性,無具體形態),即為抽象類。關鍵特徵:
abstract 修飾類super() 鏈式初始化public abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
this.name = name; this.address = address; this.number = number;
}
// 抽象方法:強制子類實現
public abstract double computePay();
// 具體方法:提供默認行為
public void mailCheck() {
System.out.println("Mailing check to " + name + " " + address);
}
// Getter/Setter...
}
// 編譯錯誤:Cannot instantiate the type Employee
Employee e = new Employee("George", "Houston", 43);
public class Salary extends Employee {
private double salary;
public Salary(String name, String address, int number, double salary) {
super(name, address, number); // 必須調用父構造器
this.salary = salary;
}
@Override
public double computePay() { // 必須實現
return salary / 52;
}
@Override
public void mailCheck() { // 可選覆寫
System.out.println("Salary mailCheck: " + getName() + " " + salary);
}
}
// 測試
public class AbstractDemo {
public static void main(String[] args) {
Salary s = new Salary("Mohtashim", "Ambehta", 3, 3600);
Employee e = new Salary("Adams", "Boston", 2, 2400); // 多態引用
s.mailCheck();
e.mailCheck();
}
}
| 特性 | 抽象類 | 普通類 | 接口 (Java 8+) |
|---|---|---|---|
| 實例化 | 否 | 是 | 否 |
| 抽象方法 | 可有 | 不可有 | 可有 (默認抽象) |
| 具體方法 | 可有 | 可有 | default/static 可有 |
| 構造器 | 可有 | 可有 | 無 |
| 字段 | 任意 | 任意 | 只能常量 |
| 繼承 | 單繼承 | 單繼承 | 多實現 |
public abstract class DataProcessor {
// 模板方法:定義算法骨架
public final void process() {
readData();
handleData();
writeData();
}
protected abstract void readData();
protected abstract void handleData();
protected abstract void writeData();
}
public class CsvProcessor extends DataProcessor {
@Override protected void readData() { /* CSV 讀取 */ }
@Override protected void handleData() { /* CSV 處理 */ }
@Override protected void writeData() { /* CSV 寫入 */ }
}
抽象類是「半成品」:封裝共性狀態與行為骨架,留出變化點給子類。核心價值在於代碼復用 + 強制契約。使用原則:有共性代碼需復用、有強制實現契約、單繼承場景 → 選抽象類。