首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 8 中 default 方法詳解

     編輯:Java 相關知識

接口默認方法:讓接口演進不破壞現有實現

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();
    }
}

解決規則優先級

  1. 類中聲明優先:類自己的實現 (或父類實現) > 接口默認方法。
  2. 子接口優先:若 B extends A 並覆寫 foo(),則 B 的版本生效。
  3. 顯式調用:InterfaceName.super.method() 手動指定。

默認方法 vs 抽象類

特性默認方法抽象類
構造器無有
狀態 (字段)無 (只能有 static final)可有實例字段
多實現類可實現多接口單繼承
訪問修飾符默認 public任意
用途接口演進、提供通用輔助方法定義實體核心屬性與行為

實戰應用:集合庫擴展

Collection 新增 stream()、forEach()、removeIf() 等默認方法,所有現有實現類 (ArrayList, HashSet 等) 自動獲得新功能,無需修改任何代碼。

注意事項

  • 默認方法不可為 final 或 synchronized。
  • 接口中不可定義實例字段,默認方法只能訪問接口的靜態常量或其他方法。
  • 慎用:過度使用會模糊接口「契約」與「實現」的界限,導致設計混亂。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved