Java 8 引入 default 關鍵字,允許在接口中定義有具體實現的方法。這解決了「接口發布後無法添加新方法」的難題,是集合庫 (Stream API) 擴展的關鍵。
public interface Greeting {
void sayHello(); // 抽象方法,實現類必須覆寫
default void sayHi() { // 默認方法,有實現
System.out.println("Hi!");
}
static void sayBye() { // 靜態方法,屬於接口
System.out.println("Bye!");
}
}
public class MyGreeting implements Greeting {
@Override
public void sayHello() {
System.out.println("Hello!");
}
// 未覆寫 sayHi(),將使用接口默認實現
}
// 測試
Greeting g = new MyGreeting();
g.sayHello(); // Hello!
g.sayHi(); // Hi! (調用默認方法)
Greeting.sayBye(); // Bye! (調用靜態方法)
當類實現多個接口,且這些接口有同名默認方法時,編譯報錯。必須在類中顯式覆寫並指定調用哪個接口的實現。
interface A { default void foo() { System.out.println("A"); } }
interface B { default void foo() { System.out.println("B"); } }
class C implements A, B {
@Override
public void foo() {
// 必須顯式選擇
A.super.foo(); // 調用 A 的默認實現
// 或 B.super.foo();
}
}
InterfaceName.super.method() 手動指定。| 特性 | 默認方法 | 抽象類 |
|---|---|---|
| 構造器 | 無 | 有 |
| 狀態 (字段) | 無 (只能有 static final) | 可有實例字段 |
| 多實現 | 類可實現多接口 | 單繼承 |
| 訪問修飾符 | 默認 public | 任意 |
| 用途 | 接口演進、提供通用輔助方法 | 定義實體核心屬性與行為 |
Collection 新增 stream()、forEach()、removeIf() 等默認方法,所有現有實現類 (ArrayList, HashSet 等) 自動獲得新功能,無需修改任何代碼。
final 或 synchronized。