| 維度 | 抽象類 (abstract class) | 接口 (interface) |
|---|---|---|
| 關鍵字 | abstract class | interface |
| 方法實現 | 可有抽象方法,也可有具體方法 | Java 7 前全抽象;Java 8+ 支持 default/static 方法 |
| 字段 | 任意修飾符、非靜態、非常量 | 隱式 public static final 常量 |
| 構造器 | 可有,供子類鏈式調用 | 無 |
| 繼承關係 | 單繼承 extends | 多實現 implements,接口可多繼承 extends |
| 訪問修飾符 | 任意 | 隱式 public (Java 9+ 支持 private 方法) |
| 設計意圖 | 「是一種」關係,代碼復用、模板方法 | 「行為契約」關係,能力標識、解耦 |
public abstract class Fruit {
private double weight; // 共性屬性
public Fruit(double weight) { this.weight = weight; }
public abstract void eat(); // 抽象行為
public void wash() { System.out.println("Washing " + this.getClass().getSimpleName()); } // 具體默認行為
}
public class Apple extends Fruit {
public Apple(double weight) { super(weight); }
@Override public void eat() { System.out.println("Crunch, sweet apple"); }
}
public class Orange extends Fruit {
public Orange(double weight) { super(weight); }
@Override public void eat() { System.out.println("Peel, juicy orange"); }
}
public interface Flyable {
void fly(); // 契約
default void hover() { System.out.println("Hovering..."); } // Java 8 默認實現
}
public class Bird extends Animal implements Flyable { // 繼承+實現
@Override public void fly() { System.out.println("Flap wings"); }
}
public class Drone implements Flyable { // 無關類別也能實現
@Override public void fly() { System.out.println("Rotors spinning"); }
}
Serializable、Comparable、Flyable)。「接口是特殊的抽象類」—— 錯誤。接口是契約規範,抽象類是部分實現。Java 8 給接口加 default 方法是為了解決接口演進兼容性,而非模糊邊界。
「盡量用接口代替抽象類」—— 片面。需要構造器鏈、非 final 共享字段、模板方法強制流程時,抽象類不可替代。
// 領域基類:共享 ID、審計字段、持久化邏輯
public abstract class BaseEntity {
protected Long id;
protected Date createTime;
// ... 通用 getter/setter、equals/hashCode 基於 id
}
// 業務契約:可審計、可軟刪除
public interface Auditable { void markDeleted(); }
public interface SoftDeletable { boolean isDeleted(); }
// 具體實體
public class User extends BaseEntity implements Auditable, SoftDeletable {
private String username;
@Override public void markDeleted() { this.deleted = true; }
@Override public boolean isDeleted() { return deleted; }
}
抽象類解決 「垂直代碼復用」,接口解決 「橫向能力解耦」。優秀設計往往是:抽象類作為領域骨架,接口定義業務契約,具體類組合繼承與實現。記住:extends 是 is-a,implements 是 can-do。