默認方法

背景

java中實現(xiàn)接口的類必須為接口中定義的每個方法提供一個實現(xiàn),或者從父類中繼承它的實現(xiàn)。這樣就導致了一個問題,一旦接口更新,那么所有實現(xiàn)類為了適配新的接口也必須進行修改。

為解決這一問題,Java 8允許在接口內(nèi)聲明靜態(tài)方法,其二,Java 8引入了一個新功能,叫默認方法。

使用

如何判別一個方法來源于何處?

如果一個類使用相同的函數(shù)簽名從多個地方(比如另一個類或接口)繼承了方法,通過三條規(guī)則可以進行判斷。

(1) 類中的方法優(yōu)先級最高。類或父類中聲明的方法的優(yōu)先級高于任何聲明為默認方法的優(yōu) 先級。

(2) 如果無法依據(jù)第一條進行判斷,那么子接口的優(yōu)先級更高:函數(shù)簽名相同時,優(yōu)先選擇 擁有最具體實現(xiàn)的默認方法的接口,即如果B繼承了A,那么B就比A更加具體。

(3) 最后,如果還是無法判斷,繼承了多個接口的類必須通過顯式覆蓋和調(diào)用期望的方法,顯式地選擇使用哪一個默認方法的實現(xiàn)。

例:下面代碼會打印什么

public interface A {
    default void hello() {
        System.out.println("Hello from A");
    }
}
public interface B extends A {
    default void hello() {
        System.out.println("Hello from B");
        } 
}
public class C implements B, A {
    public static void main(String... args) {
        new C().hello();
    }
}

類C沒有提供hello的實現(xiàn),所以按照規(guī)則(2),應該選擇的是提供了最具體實現(xiàn)的 默認方法的接口。由于B比A更具體,所以應該選擇B的hello方法。所以,程序會打印輸出“Hello from B”。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 傳統(tǒng)上,Java程序的接口是將相關(guān)方法按照約定組合到一起的方式。實現(xiàn)接口的類必須為接口中定義的每個方法提供一個實現(xiàn)...
    后端小哥閱讀 410評論 0 0
  • 1.簡述 在Java8之前,Java程序接口是將相關(guān)方法按照約定組合到一起的方式。實現(xiàn)接口的類必須為接口中定義的每...
    50fc16abfd49閱讀 747評論 0 0
  • 默認方法Java 8中的接口現(xiàn)在支持在聲明方法的同時提供實現(xiàn)。通過兩種方式可以完成這種操作。其一,Java 8允許...
    PawsUp閱讀 705評論 0 0
  • 默認方法是啥 默認方法是由default修飾符修飾,并像類中聲明的其他方法一樣包含方法體。是Java8中新添加的能...
    野狗道人闖紅燈閱讀 921評論 0 0
  • 在前面的文章中,我們學習了 Lambda 表達式和函數(shù)式接口。接下來我們繼續(xù)討論與之相關(guān)的特性 --- 默認方法。...
    懶癌正患者閱讀 575評論 1 2

友情鏈接更多精彩內(nèi)容