成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 8 新特性之默認方法(Default Methods)

QLQ / 3151人閱讀

摘要:概述引入了新的語言特性默認方法。覆寫默認方法,這跟類與類之間的覆寫規(guī)則相類似。靜態(tài)默認方法的另一個特性是接口可以聲明并且可以提供實現(xiàn)靜態(tài)方法本文首發(fā)于凌風(fēng)博客新特性之默認方法作者凌風(fēng)

1. 概述

Java 8 引入了新的語言特性——默認方法(Default Methods)。

默認方法允許您添加新的功能到現(xiàn)有庫的接口中,并能確保與采用舊版本接口編寫的代碼的二進制兼容性。

1.1 為什么要有默認方法

在 Java 8之前,接口與其實現(xiàn)類之間的耦合度太高了,當(dāng)需要為一個接口添加方法時,所有的實現(xiàn)類都必須隨之修改。默認方法解決了這個問題,它可以為接口添加新的方法,而不會破壞已有的接口的實現(xiàn)。這在 lambda 表達式作為 Java 8 語言的重要特性而出現(xiàn)之際,為升級舊接口且保持向后兼容提供了途徑。

還有就就是 Java 8 的函數(shù)式接口只允許有一個抽象方法,但可以有多個默認方法。

String[] array = new String[] {"hello",", ","world", };
List list = Arrays.asList(array);
list.forEach(System.out::println); // 這是 jdk 1.8 新增的接口默認方法

這個 forEach 方法是 jdk 1.8 新增的接口默認方法,正是因為有了默認方法的引入,才不會因為 Iterable 接口中添加了 forEach 方法就需要修改所有 Iterable 接口的實現(xiàn)類。

1.2 語法格式
interface InterfaceA {
    default void print() {
        System.out.println("InterfaceA print");
    }
}
2. 默認方法(default) 2.1 實例
interface InterfaceA {
    default void print() {
        System.out.println("InterfaceA print");
    }
}

class ClassA implements InterfaceA {

}
public class Java8Test {
    public static void main(String[] args) {
        new ClassA().print(); // 打印:“InterfaceA print”
    }
}

ClassA 類并沒有實現(xiàn) InterfaceA 接口中的 print 方法,InterfaceA 接口中提供了 print 方法的默認實現(xiàn),因此可以直接調(diào)用 ClassA 類的 print 方法。

2.2 默認方法的繼承
interface InterfaceA {
    default void print() {
        System.out.println("InterfaceA print");
    }
}

interface InterfaceB extends InterfaceA {

}

interface InterfaceC extends InterfaceA {
    @Override
    default void print() {
        System.out.println("InterfaceC print");
    }
}

interface InterfaceD extends InterfaceA {
    @Override
    void print();
}
public class Java8Test {
    public static void main(String[] args) {
        new InterfaceB() {}.print(); // 打?。?InterfaceA print"
        new InterfaceC() {}.print();// 打?。?InterfaceC print"
        new InterfaceD() {
            @Override
            public void print(){
                System.out.println("InterfaceD print");
            }
        }.print();// 打印:“InterfaceD print”

        // 或者使用 lambda 表達式
        ((InterfaceD) () -> System.out.println("InterfaceD print")).print();
    }
}

接口默認方法的繼承分三種情況(分別對應(yīng)上面的 InterfaceB 接口、InterfaceC 接口和 InterfaceD 接口):

不覆寫默認方法,直接從父接口中獲取方法的默認實現(xiàn)。

覆寫默認方法,這跟類與類之間的覆寫規(guī)則相類似。

覆寫默認方法并將它重新聲明為抽象方法,這樣新接口的子類必須再次覆寫并實現(xiàn)這個抽象方法。

2.3 類優(yōu)先原則

接口默認方法的類優(yōu)先原則

若一個接口中定義了一個默認方法,而另外一個父類或接口中又定義了一個同名的方法時

選擇父類中的方法。如果一個父類提供了具體的實現(xiàn),那么接口中具有相同名稱和參數(shù)的默認方法會被忽略。

接口沖突。如果一個父接口提供一個默認方法,而另一個接口也提供了一個具有相同名稱和參數(shù)列表的方法(不管方法是否是默認方法),那么必須覆蓋該方法來解決沖突

public interface FunA {
    default String getName() {
        return "aaaa";
    }
}
public class ClassA {
    public String getName() {
        return "bbb";
    }
}
public class SubClass extends ClassA implements FunA {
}

測試方法

@Test
public void t1(){
    SubClass subClass = new SubClass();
    System.out.println(subClass.getName()); // 輸出的是 bbb
}

注意 :

default 關(guān)鍵字只能在接口中使用(以及用在 switch 語句的 default 分支),不能用在抽象類中。

接口默認方法不能覆寫 Object 類的 equalshashCodetoString 方法。

接口中的靜態(tài)方法必須是 public 的,public 修飾符可以省略,static 修飾符不能省略。

即使使用了 java 8 的環(huán)境,一些 IDE 仍然可能在一些代碼的實時編譯提示時出現(xiàn)異常的提示(例如無法發(fā)現(xiàn) java 8 的語法錯誤),因此不要過度依賴 IDE。

3. 靜態(tài)默認方法

Java 8 的另一個特性是接口可以聲明(并且可以提供實現(xiàn))靜態(tài)方法

interface InterfaceA {
    default void print() {
        System.out.println("InterfaceA print");
    }

    static void staticMethod(){
        System.out.println("InterfaceA staticMethod");
    }
}
本文首發(fā)于凌風(fēng)博客:Java 8 新特性之默認方法(Default Methods)
作者:凌風(fēng)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72780.html

相關(guān)文章

  • JAVA9-12特性簡述

    摘要:本文是個人在企業(yè)內(nèi)部分享使用的簡要大綱,列舉了的重要更新,文章的結(jié)構(gòu)較簡單,也不規(guī)范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流留用。 本文是個人在企業(yè)內(nèi)部分享使用的簡要大綱,列舉了JAVA9-12的重要更新,文章的結(jié)構(gòu)較簡單,也不規(guī)范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流copy留用。 一 JAVA9 新特性 1.Java Platfo...

    TigerChain 評論0 收藏0
  • Java基礎(chǔ)知識整理注解

    摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數(shù)據(jù)與程序元素類方法成員變量等進行關(guān)聯(lián)。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業(yè)務(wù)邏輯無關(guān),并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(...

    blastz 評論0 收藏0
  • Java8特性學(xué)習(xí)筆記

    摘要:雖然目前工作環(huán)境仍然以為主,不過目前已是大勢所趨了。標準函數(shù)式接口新的包定義旨在使用的廣泛函數(shù)式接口。這一改進使得擁有了類似于多繼承的能力。 從Java8發(fā)布到現(xiàn)在有好幾年了,而Java9也提上發(fā)布日程了(沒記錯的話好像就是這個月2017年7月,也許會再度跳票吧,不過沒關(guān)系,穩(wěn)定大于一切,穩(wěn)定了再發(fā)布也行),現(xiàn)在才開始去真正學(xué)習(xí),說來也是慚愧。雖然目前工作環(huán)境仍然以Java6為主,不過...

    wthee 評論0 收藏0
  • Java Lambda 表達式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記

    摘要:表達式又名閉包匿名函數(shù)筆記根據(jù)終于在中引入了表達式。函數(shù)式接口要介紹中表達式的實現(xiàn),需要知道什么是函數(shù)式接口。但同樣需要保證外部的自由變量不能在表達式中被改變。 Java Lambda 表達式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記 根據(jù) JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達式。也稱之為閉包或者匿名函數(shù)。 showImg(https...

    fou7 評論0 收藏0
  • Java8 特性:Lambda表達式和虛擬擴展方法標注

    摘要:摘要添加了表達式閉包和特性支持,包括方法的引用,增強類型推斷,和虛擬擴展方法。圍繞的語言功能支持包括虛擬擴展方法,這將使接口的源代碼和二進制兼容的方式演變升級。 Author:Joseph D. Darcy Organization:Oracle Owner:Brian Goetz Created:2011/11/1 Updated:2013/2/21 Type:Feature Sta...

    UsherChen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<