Java 8 允許介面用 default 關鍵字提供方法**默認實現**。核心目的:**接口演進不破壞現有實現類**(如 Collection 新增 stream()、forEach())。
public interface MyInterface {
void existingMethod(); // 抽象方法
default void newMethod() { // 默認方法
System.out.println("Default impl");
}
static void staticMethod() { // 靜態方法(同 JDK 8 新增)
System.out.println("Static impl");
}
}
實現類可選擇:繼承默認實現、覆寫、或聲明為抽象強制子類實現。
interface A { default void m() { System.out.println("A"); } }
interface B { default void m() { System.out.println("B"); } }
class C implements A, B { } // 編譯錯誤:Conflicting default methods
規則:編譯報錯,強制實現類解決衝突。C 必須顯式實現 m():
class C implements A, B {
public void m() { A.super.m(); } // 顯式選擇調用 A 的默認實現
}
interface A { default void m() { ... } }
interface B { void m(); } // 抽象
class C implements A, B { } // 編譯錯誤:同樣衝突
規則:抽象方法**不佔優勢**,仍視為衝突,需實現類顯式實現。
class Base { void m() { System.out.println("Base"); } }
interface A { default void m() { System.out.println("A"); } }
class C extends Base implements A { } // OK,輸出 "Base"
規則:**類優先於介面**。父類實例方法勝過介面默認方法(兼容性原則)。
Java 8 為兼容性做出妥協:**編譯期檢測衝突,但運行期允許某些不一致**。
// 步驟 1:編譯基礎版本
interface I1 { default void m() { ... } }
interface I2 { } // 無 m()
class C implements I1, I2 { }
// 步驟 2:單獨修改 I2 增加抽象 m(),重新編譯 I2
interface I2 { void m(); }
// 步驟 3:運行 C(未重新編譯 C) -> 正常運行,調用 I1.m()
// 步驟 4:修改 I2 提供默認 m(),重新編譯 I2
interface I2 { default void m() { ... } }
// 步驟 5:運行 C -> **IncompatibleClassChangeError: Conflicting default methods**



process()、execute()),加前綴或具體業務語義static 解決盡量不用 defaultInterface.super.method()」默認方法是 JDK 8 為集合框架演進引入的「必要之惡」。它打破了「介面只有契約」的鐵律,帶來**菱形衝突、編譯運行不一致、類優先規則**等認知負擔。原則:**能不寫盡量不寫,必須寫則嚴格管控命名與衝突文檔**。