摘要:概述引入了新的語言特性默認方法。覆寫默認方法,這跟類與類之間的覆寫規(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", }; Listlist = 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 }
3. 靜態(tài)默認方法注意 :
default 關(guān)鍵字只能在接口中使用(以及用在 switch 語句的 default 分支),不能用在抽象類中。
接口默認方法不能覆寫 Object 類的 equals、hashCode 和 toString 方法。
接口中的靜態(tài)方法必須是 public 的,public 修飾符可以省略,static 修飾符不能省略。
即使使用了 java 8 的環(huán)境,一些 IDE 仍然可能在一些代碼的實時編譯提示時出現(xiàn)異常的提示(例如無法發(fā)現(xiàn) java 8 的語法錯誤),因此不要過度依賴 IDE。
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
摘要:本文是個人在企業(yè)內(nèi)部分享使用的簡要大綱,列舉了的重要更新,文章的結(jié)構(gòu)較簡單,也不規(guī)范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流留用。 本文是個人在企業(yè)內(nèi)部分享使用的簡要大綱,列舉了JAVA9-12的重要更新,文章的結(jié)構(gòu)較簡單,也不規(guī)范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流copy留用。 一 JAVA9 新特性 1.Java Platfo...
摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數(shù)據(jù)與程序元素類方法成員變量等進行關(guān)聯(lián)。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業(yè)務(wù)邏輯無關(guān),并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(...
摘要:雖然目前工作環(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為主,不過...
摘要:表達式又名閉包匿名函數(shù)筆記根據(jù)終于在中引入了表達式。函數(shù)式接口要介紹中表達式的實現(xiàn),需要知道什么是函數(shù)式接口。但同樣需要保證外部的自由變量不能在表達式中被改變。 Java Lambda 表達式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記 根據(jù) JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達式。也稱之為閉包或者匿名函數(shù)。 showImg(https...
摘要:摘要添加了表達式閉包和特性支持,包括方法的引用,增強類型推斷,和虛擬擴展方法。圍繞的語言功能支持包括虛擬擴展方法,這將使接口的源代碼和二進制兼容的方式演變升級。 Author:Joseph D. Darcy Organization:Oracle Owner:Brian Goetz Created:2011/11/1 Updated:2013/2/21 Type:Feature Sta...
閱讀 1088·2021-11-24 09:39
閱讀 1320·2021-11-18 13:18
閱讀 2463·2021-11-15 11:38
閱讀 1841·2021-09-26 09:47
閱讀 1641·2021-09-22 15:09
閱讀 1634·2021-09-03 10:29
閱讀 1522·2019-08-29 17:28
閱讀 2961·2019-08-29 16:30