摘要:概述引入了新的語言特性默認方法。覆寫默認方法,這跟類與類之間的覆寫規則相類似。靜態默認方法的另一個特性是接口可以聲明并且可以提供實現靜態方法本文首發于凌風博客新特性之默認方法作者凌風
1. 概述
Java 8 引入了新的語言特性——默認方法(Default Methods)。
默認方法允許您添加新的功能到現有庫的接口中,并能確保與采用舊版本接口編寫的代碼的二進制兼容性。
1.1 為什么要有默認方法在 Java 8之前,接口與其實現類之間的耦合度太高了,當需要為一個接口添加方法時,所有的實現類都必須隨之修改。默認方法解決了這個問題,它可以為接口添加新的方法,而不會破壞已有的接口的實現。這在 lambda 表達式作為 Java 8 語言的重要特性而出現之際,為升級舊接口且保持向后兼容提供了途徑。
還有就就是 Java 8 的函數式接口只允許有一個抽象方法,但可以有多個默認方法。
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 接口的實現類。
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 類并沒有實現 InterfaceA 接口中的 print 方法,InterfaceA 接口中提供了 print 方法的默認實現,因此可以直接調用 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(); } }
接口默認方法的繼承分三種情況(分別對應上面的 InterfaceB 接口、InterfaceC 接口和 InterfaceD 接口):
不覆寫默認方法,直接從父接口中獲取方法的默認實現。
覆寫默認方法,這跟類與類之間的覆寫規則相類似。
覆寫默認方法并將它重新聲明為抽象方法,這樣新接口的子類必須再次覆寫并實現這個抽象方法。
2.3 類優先原則接口默認方法的類優先原則
若一個接口中定義了一個默認方法,而另外一個父類或接口中又定義了一個同名的方法時
選擇父類中的方法。如果一個父類提供了具體的實現,那么接口中具有相同名稱和參數的默認方法會被忽略。
接口沖突。如果一個父接口提供一個默認方法,而另一個接口也提供了一個具有相同名稱和參數列表的方法(不管方法是否是默認方法),那么必須覆蓋該方法來解決沖突
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. 靜態默認方法注意 :
default 關鍵字只能在接口中使用(以及用在 switch 語句的 default 分支),不能用在抽象類中。
接口默認方法不能覆寫 Object 類的 equals、hashCode 和 toString 方法。
接口中的靜態方法必須是 public 的,public 修飾符可以省略,static 修飾符不能省略。
即使使用了 java 8 的環境,一些 IDE 仍然可能在一些代碼的實時編譯提示時出現異常的提示(例如無法發現 java 8 的語法錯誤),因此不要過度依賴 IDE。
Java 8 的另一個特性是接口可以聲明(并且可以提供實現)靜態方法
interface InterfaceA { default void print() { System.out.println("InterfaceA print"); } static void staticMethod(){ System.out.println("InterfaceA staticMethod"); } }
本文首發于凌風博客:Java 8 新特性之默認方法(Default Methods)
作者:凌風
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72780.html
摘要:本文是個人在企業內部分享使用的簡要大綱,列舉了的重要更新,文章的結構較簡單,也不規范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流留用。 本文是個人在企業內部分享使用的簡要大綱,列舉了JAVA9-12的重要更新,文章的結構較簡單,也不規范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流copy留用。 一 JAVA9 新特性 1.Java Platfo...
摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據與程序元素類方法成員變量等進行關聯。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業務邏輯無關,并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(...
摘要:雖然目前工作環境仍然以為主,不過目前已是大勢所趨了。標準函數式接口新的包定義旨在使用的廣泛函數式接口。這一改進使得擁有了類似于多繼承的能力。 從Java8發布到現在有好幾年了,而Java9也提上發布日程了(沒記錯的話好像就是這個月2017年7月,也許會再度跳票吧,不過沒關系,穩定大于一切,穩定了再發布也行),現在才開始去真正學習,說來也是慚愧。雖然目前工作環境仍然以Java6為主,不過...
摘要:表達式又名閉包匿名函數筆記根據終于在中引入了表達式。函數式接口要介紹中表達式的實現,需要知道什么是函數式接口。但同樣需要保證外部的自由變量不能在表達式中被改變。 Java Lambda 表達式(又名閉包 (Closure)/ 匿名函數 ) 筆記 根據 JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達式。也稱之為閉包或者匿名函數。 showImg(https...
摘要:摘要添加了表達式閉包和特性支持,包括方法的引用,增強類型推斷,和虛擬擴展方法。圍繞的語言功能支持包括虛擬擴展方法,這將使接口的源代碼和二進制兼容的方式演變升級。 Author:Joseph D. Darcy Organization:Oracle Owner:Brian Goetz Created:2011/11/1 Updated:2013/2/21 Type:Feature Sta...
閱讀 1074·2021-11-24 09:39
閱讀 1307·2021-11-18 13:18
閱讀 2425·2021-11-15 11:38
閱讀 1824·2021-09-26 09:47
閱讀 1625·2021-09-22 15:09
閱讀 1624·2021-09-03 10:29
閱讀 1510·2019-08-29 17:28
閱讀 2951·2019-08-29 16:30