abstract class:使用 abstract 修飾的類,**不能直接實例化**(new Abstract() 編譯錯誤),但可聲明引用變量。作為繼承體系的「半成品」,規範子類結構,提供共享實現。
abstract method:無方法體(無 {}),以分號結尾,強制子類覆寫(除非子類也 abstract)。
| 規則 | 說明 |
|---|---|
| 修飾符 | public/protected/default,不可 private(子類不可見) |
| 抽象方法所在類 | 必須為 abstract class 或 interface |
| 子類義務 | 覆寫所有抽象方法,或繼續聲明 abstract |
| 構造器 | 有,供子類 super(...) 調用,不可 new 直接調用 |
| 字段/普通方法 | 可有任意(含 private、static、final) |
| 可聲明引用 | AbstractType ref; ✓,new AbstractType() ✗ |
// 工具類:所有方法 static,防誤 new
public abstract class MathUtils {
private MathUtils() {} // 或無構造器(隱式 protected)
public static int max(int a, int b) { return a > b ? a : b; }
}
// 配合 final 徹底封死繼承
public abstract final class Constants { // 編譯錯誤:abstract 和 final 互斥
// 正確做法:
public final class Constants {
private Constants() {}
public static final String APP_NAME = "MyApp";
}
注意:abstract 和 final 互斥。防實例化用 private 構造器 或 final class + private 構造器。
場景:遊戲怪物體系,每種怪物移動規則不同,但調用者統一呼叫 move()。
public abstract class Monster {
protected int x, y; // 共享座標狀態
// 模板方法:定義移動流程骨架
public final void move() {
beforeMove();
doMove(); // 抽象點:子類實現具體規則
afterMove();
}
protected void beforeMove() { System.out.println("Start moving"); }
protected void afterMove() { System.out.println("End at " + x + "," + y); }
// 強制子類實現
protected abstract void doMove();
}
// 具體怪物
public class FlyingMonster extends Monster {
@Override protected void doMove() { y += 10; } // 飛行:Y 軸增加
}
public class WalkingMonster extends Monster {
@Override protected void doMove() { x += 5; } // 行走:X 軸增加
}
// 統一調用
List monsters = Arrays.asList(new FlyingMonster(), new WalkingMonster());
monsters.forEach(Monster::move); // 多態分發
滿足以下任一 → 考慮抽象類:
protected 模板鉤子、private 內部邏輯)。| 維度 | 抽象類 | 介面 (JDK 7) |
|---|---|---|
| 繼承/實現 | 單繼承 extends | 多實現 implements |
| 方法類型 | 抽象 + 具體 | 僅抽象 |
| 字段 | 實例/靜態/常量 | 僅常量 (public static final) |
| 構造器 | 有 | 無 |
| 訪問控制 | 全套 | 隱式 public |
final class + private 構造器(工具類標準寫法)。final class Constants { private Constants(){} }。Serializable、Cloneable 等標記介面(無方法,反射檢測)。「不濫用繼承」—— 優先組合(
has-a),符合is-a且需共享實現時才用繼承。
抽象類是強耦合關係(繼承 = 白盒復用),介面是弱耦合(實現 = 黑盒契約)。