| 維度 | 接口 | 抽象類 |
| 方法實現 | Java 7:全 abstract;Java 8+:可 default/static/private | 可混合抽象/具體方法 |
| 字段類型 | 隱式 public static final(常量) | 任意修飾符、任意類型 |
| 構造器 | 無 | 可有(供子類鏈式調用) |
| 靜態代碼塊 | 無 | 可有 |
| 繼承/實現 | 類可 implements 多個接口;接口可 extends 多個接口 | 類只能 extends 一個抽象類 |
| 設計意圖 | 定義**能力邊界**、支援多態替換、解耦 | 提煉**共性代碼**、模板方法模式骨架 |
| 演進成本 | 新增方法破壞實現類(Java 8 default 緩解) | 新增具體方法不影響子類 |
接口定義語法與規範
[public] interface InterfaceName extends Parent1, Parent2 {
// 常量:隱式 public static final
String CONSTANT = "VALUE";
int MAX_SIZE = 100;
// 抽象方法:隱式 public abstract
void doSomething();
int calculate(int a, int b);
// Java 8+ 默認方法:提供通用實現,實現類可選覆蓋
default void log(String msg) { System.out.println("[LOG] " + msg); }
// Java 8+ 靜態方法:工具方法,不可覆蓋
static InterfaceName create() { return new Impl(); }
// Java 9+ 私有方法:默認/靜態方法內部復用
private void helper() { ... }
}
關鍵注意點(避坑指南)
- 常量必須顯式初始化,不能僅聲明
int MAX;。
- 方法默認 public abstract,不可用
protected/private(除 Java 9+ private 方法)。
- 接口不可實例化,無構造器,無法
new Interface()。
- 接口間多繼承:
interface C extends A, B {},若 A/B 有同名默認方法,C **必須覆蓋**消除歧義。
- 實現類必須實現所有抽象方法,否則類必須聲明
abstract。
- 菱形繼承問題:Java 8 強制實現類覆蓋衝突的默認方法,編譯期報錯保證安全。
實戰設計原則
1. 接口隔離原則(ISP)
拆分臃腫接口:UserRepository、UserService、UserEventPublisher 分離,避免實現類依賴不需要的方法。
2. 依賴倒置原則(DIP)
高層模組依賴接口(PaymentService),低層模組實現接口(AlipayPayment, WechatPayment),運行時注入具體實現。
3. 面向接口編程
// 良好:聲明類型用接口
List list = new ArrayList<>();
Map cache = new ConcurrentHashMap<>();
PaymentProcessor processor = paymentFactory.getProcessor(channel);
4. 接口命名慣例
- 能力描述:
Serializable, Comparable, Runnable, Closeable。
- 服務契約:
UserService, OrderRepository(不加 I 前綴,現代風格)。
Java 8+ 接口演進帶來的新機遇
- 默認方法:集合框架
Collection.stream()、Map.computeIfAbsent() 等無需破壞現有實現即可擴展。
- 函數式接口:單抽象方法接口(
@FunctionalInterface),支援 Lambda 表達式與方法引用,開啟函數式編程。
- 私有方法:接口內部代碼復用,不洩露給實現類。
總結
接口是 Java 實現**多態、解耦、擴展**的基石。優秀設計:接口定義契約,抽象類提供骨架,具體類實現業務。理解接口與抽象類的本質區別,是架構師級思維的分水嶺。
- 上一篇文章: Java static 關鍵字全解析:靜態域、方法、代碼塊、導入與內部類五大用法
- 下一篇文章: JavaWeb 核心知識體系總結:HTTP 狀態碼、請求響應頭、Cookie、JSP/Servlet、Tomcat 配置全覽
Copyright ©
程式碼之家 All Rights Reserved