默認(rèn)方法

  • 默認(rèn)方法
    Java 8中的接口現(xiàn)在支持在聲明方法的同時(shí)提供實(shí)現(xiàn)。通過兩種方式可以完成這種操作。其一,Java 8允許在接口內(nèi)聲明靜態(tài)方法。其二,Java 8引入了一個(gè)新功能,叫默認(rèn)方法,通過默認(rèn)方法可以指定接口方法的默認(rèn)實(shí)現(xiàn)。換句話說,接口能提供方法的具體實(shí)現(xiàn)。因此,實(shí)現(xiàn)接口的類如果不顯式地提供該方法的具體實(shí)現(xiàn),就會(huì)自動(dòng)繼承默認(rèn)的實(shí)現(xiàn)。
    默認(rèn)方法由default修飾符修飾,并像類中聲明其他方法一樣包含方法體,是一種以源碼兼容方式向接口內(nèi)添加實(shí)現(xiàn)的方法。

    Java8中抽象類和抽象接口:

    1. 一個(gè)類只能繼承一個(gè)抽象類,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。
    2. 一個(gè)抽象類可以通過實(shí)例變量(字段)保存一個(gè)通用狀態(tài),而接口是不能有實(shí)例變量的。
  • 使用模式
    可選方法/行為的多繼承

    interface Iterator<T> {
        boolean hasNext();
        T next();
        default void remove() {
             throw new UnsupportedOperationException();
       }
    } 
    

    采用默認(rèn)方法之后,可以為這種類型的方法提供一個(gè)默認(rèn)的實(shí)現(xiàn),這樣實(shí)體類就無需在自己的實(shí)現(xiàn)中顯式地提供一個(gè)空方法。

  • 解決現(xiàn)一個(gè)類繼承了多個(gè)方法而它們使用的卻是同樣的函數(shù)簽名
    例如:

    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();
       }
    } 
    //由于B比A更具體,所以應(yīng)該選擇B的hello方法。所以,程序會(huì)打印輸出“Hellofrom B”
    
    1. 類中的方法優(yōu)先級(jí)最高。類或父類中聲明的方法的優(yōu)先級(jí)高于任何聲明為默認(rèn)方法的優(yōu)先級(jí)。

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

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

       public class D implements A{ }
       public class C extends D implements B, A {
            public static void main(String... args) {
                new C().hello();
            }
       } 
       //程序會(huì)打印輸出“Hello from B”
      

    依據(jù)規(guī)則(1),類中聲明的方法具有更高的優(yōu)先級(jí)。D并未覆蓋hello方法,可是它實(shí)現(xiàn)了接口A。所以它就擁有了接口A的默認(rèn)方法。規(guī)則(2)說如果類或者父類沒有對(duì)應(yīng)的方法,那么就應(yīng)該選擇提供了最具體實(shí)現(xiàn)的接口中的方法。因此,編譯器會(huì)在接口A和接口B的hello方法之間做選擇。由于B更加具體,所以程序會(huì)再次打印輸出“Hello from B”。

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

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,663評(píng)論 1 32
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 5,216評(píng)論 1 114
  • 在前面的文章中,我們學(xué)習(xí)了 Lambda 表達(dá)式和函數(shù)式接口。接下來我們繼續(xù)討論與之相關(guān)的特性 --- 默認(rèn)方法。...
    懶癌正患者閱讀 575評(píng)論 1 2
  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,565評(píng)論 0 4
  • 以欣賞的眼光看待別人 又不失掉自己的自信
    幸福的去追求而不是追求幸福閱讀 236評(píng)論 0 0

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