abstract class 與 interface 是 Java 支援抽象定義的兩大機制,賦予 Java 強大的面向對象能力。二者相似卻本質不同,選擇反映了對問題領域本質的理解深度。
// abstract class 方式
abstract class Demo {
abstract void method1();
abstract void method2();
// 可有字段、構造器、具體方法
}
// interface 方式
interface Demo {
void method1();
void method2();
// 僅 static final 字段、abstract 方法(Java 8 前)
}
本質:接口是抽象類的特殊形式(更純粹的契約)。
| # | 差異點 | abstract class | interface |
|---|---|---|---|
| 1 | 繼承關係 | 單繼承 extends | 多實現 implements |
| 2 | 默認方法實現 | ✅ 具體方法 | Java 8+ default,否則無 |
| 3 | 維護成本 | 修改默認實現即可 | 無默認實現時,所有實現類需修改 |
| 4 | 代碼復用 | 字段、構造器、工具方法 | 無實例狀態,復用靠組合/委托 |
| 5 | 構造器 | ✅ | ❌ |
| 6 | 靜態方法 | ✅ | Java 8+ ✅ |
Comparable、Runnable、DataSource;AbstractList、HttpServlet、JdbcTemplate;public abstract class BaseServlet extends HttpServlet {
public final void service(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
logAccess(req);
if (!checkPermission(req)) return;
try {
doService(req, resp); // 子類實現
} catch (Exception e) {
handleException(e, resp);
}
}
protected abstract void doService(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException;
}
final 鎖定流程,protected abstract 開放變化點,體現「好萊塢原則」。
List + AbstractList)。