經典規則(JDK 1.7 及之前)
- 接口屬性:隱式
public static final(即常量),必須顯式初始化;
- 接口方法:隱式
public abstract,不能有方法體;
- 無論源碼是否寫出這些修飾符,編譯器最終生成的字節碼均按上述規則處理。
JDK 1.8 重大變革
| 新特性 | 關鍵字 | 說明 |
| 默認方法 | default | 接口中可有方法體,實現類可選擇重寫,解決接口擴展兼容性問題 |
| 靜態方法 | static | 接口級工具方法,不可被實現類重寫,通過 InterfaceName.method() 調用 |
| 私有方法 | private | JDK 1.9+,供默認/靜態方法內部復用,不可被繼承 |
代碼示例
public interface Vehicle {
// 隱式 public static final
int MAX_SPEED = 200;
// 隱式 public abstract
void start();
// JDK 1.8 默認方法
default void stop() {
System.out.println("Vehicle stopping...");
brake();
}
// JDK 1.8 靜態方法
static void honk() {
System.out.println("Beep beep!");
}
// JDK 1.9 私有方法
private void brake() {
System.out.println("Applying brakes...");
}
}
常見誤區
- ❌ 接口屬性可被賦值修改 —— 編譯報錯,屬性為 final;
- ❌ 實現類「重寫」靜態方法 —— 實為「遮蔽」,多態失效;
- ✅ 默認方法可被繼承、重寫、甚至通過
Interface.super.method() 顯式調用父接口實現。
最佳實踐建議
- 接口定義常量時使用
static final 明確語義;
- 優先用默認方法替代抽象類提供骨架實現;
- 工具類方法放入接口
static 方法,避免無用實例化;
- 內部復用邏輯用
private 方法封裝,保持接口整潔。