摘要:語法中接口可以包含實現方法,需要使用修飾,此類方法稱為默認方法。核心特性接口默認方法就介紹到這里了,后續小樂會繼續講述核心特性。
JAVA8已經發布很久,是自java5(2004年發布)之后Oracle發布的最重要的一個版本。其中包括語言、編譯器、庫、工具和JVM等諸多方面的新特性,對于國內外互聯網公司來說,Java8是以后技術開發的趨勢。這里主要講解在開發中幾個核心的新特性。(主要從新特性概念解釋、語法定義、簡單代碼演示、優缺點分析、項目實戰幾個方面編寫)。
**
一、核心特性一覽**
上圖就是Java8的6個核心特性,小樂將會一一給大家闡述,請關注樂字節哦!
**
二、接口默認方法**
在注冊網站時,我們會在注冊后使用網站提供的默認頭像,應用程序安裝成功后通常會提供默認圖標,在電商網站購買過商品進行支付時,我們會設置常用收貨地址為默認地址,看起來生活中很多場景都有默認一說。Java8 開始,同樣也有默認這個詞的出現,這里針對接口Java8擴展了接口原有功能,并對默認方法提供支持。
1、概念從Java8開始,程序允許在接口中包含帶有具體實現的方法,使用default修飾,這類方法就是默認方法。默認方法在接口中可以添加多個,并且Java8提供了很多對應的接口默認方法。
2、語法Java8中接口可以包含實現方法,需要使用default修飾,此類方法稱為默認方法。默認方法在接口中必須提供實現,在實現類中可以按需重寫。默認方法只能在實現類中或通過實現類對象調用。如下形式:
public interface IMathOperation { /** * 定義接口默認方法 支持方法形參 */ default void print(){ System.out.println("數值運算基本接口默認打印方法。。。"); } }3、簡單使用
接口定義
定義IMathOperation 接口 并提供默認打印方法
public interface IMathOperation {
/** * 定義接口默認方法 支持方法形參
*/ default void print(){ System.out.println("這是數值運算基本接口。。。"); } /** * 整數加法運算方法 * @param a * @param b * @return */ public int add(int a,int b); }
子類實現
定義MathOperationImpl子類 實現IMathOperation 接口
子類在實現時,按需重寫接口默認方法
public class MathOperationImpl implements IMathOperation { @Override public int add(int a, int b) { // 子類中可以直接調用父類接口默認方法 IMathOperation.super.print(); // 調用父類靜態默認方法 IMathOperation.version(); return a+b; } }4、多個默認方法
使用Java8開發應用程序,子類實現多個接口時,對于接口默認方法定義允許定義多個默認方法,并且接口默認方法可能會出現同名情況,此時對于子類在實現或者調用時通常遵循以下原則:
1.類中的方法優先級最高
2.如果第一條無法進行判斷,那么子接口的優先級更高:函數簽名相同時,優先選擇擁有最具體實現的默認方法的接口,即如果B繼承了A,那么B就比A更加具體
示例代碼如下:
/** * 定義手機接口 提供默認info方法 */ public interface Phone { default void info(){ System.out.println("這是一部手機"); } } /** * 定義MiPhone子接口 并繼承 Phone 父接口 同時也提供info方法 */ public interface MiPhone extends Phone{ default void info(){ System.out.println("這是一部小米手機"); } } /** * 實現 Phone MiPhone 接口 */ public class M2sPhone implements Phone,MiPhone { public static void main(String[] args) { new M2sPhone().info(); } } 打印結果: 這是一部小米手機三、接口靜態方法
接口中除了允許定義多個默認方法之外,Java8也允許在接口中定義多個靜態方法,靜態方法即通過static 修飾的方法。接口中靜態方法也必須提供實現,提供了可以直接通過接口調用方法的方式。
public interface IMathOperation { /** * 定義接口默認方法 支持方法形參 */ default void print(){ System.out.println("這是數值運算基本接口。。。"); } /** * 定義靜態默認方法 */ static void version(){ System.out.println("這是1.0版簡易計算器"); } }
接口中的靜態方法只能通過接口本身去調用,類似于 Class 中的靜態方法,不存在默認方法中的多繼承問題,靜態方法并不能在實現類中被覆寫,實現類中可以聲明相同的方法,但這兩個方法之間除了名字相同,并沒有 Override 關系。
四、接口默認方法實戰 1、網站活躍TOP3用戶遍歷這里以博客網站舉例,比如統計每個月網站前三活躍用戶(按用戶文章發表量評判),使用集合遍歷操作來使用接口默認方法,對于測試數據如下:
uList= new ArrayList<>(); uList.add(new UserDto(35,"zs","126xxx@126.com",800,"lv4")); uList.add(new UserDto(60,"js_li","157xxx@139.com",500,"lv3")); uList.add(new UserDto(78,"fc_007","126@126.com",260,"lv2"));
增強for實現
得到統計集合數據后,最簡單的方式使用增強for實現,也是java8之前常用的方式。
System.out.println("----------集合遍歷-->原始遍歷方法---------"); for(UserDto u:uList){ System.out.println(u); }
自定義接口默認方法
/**
@Version 1.0
定義MyList 接口 并提供myForeach 默認方法
*/ public interface MyList{ /** * 定義接口默認方法 * @param t */ default public void myForeach(List t){ for(Object o:t){ System.out.println(o); } } } /** * @Version 1.0 * 定義MyArrayList 子類 實現MyList 接口,繼承ArrayList */ public class MyArrayList extends ArrayList implements MyList { } /** 執行遍歷 */ System.out.println("----------集合遍歷-->自定義接口默認方法---------"); // 使用自定義的接口默認方法實現集合元素遍歷 uList.myForeach(uList);
使用增強的Iterable接口默認方法
System.out.println("----------集合遍歷-->增強的List接口默認方法---------"); uList.forEach(new Consumer2、網站活躍TOP3用戶排序() { @Override public void accept(UserDto userDto) { System.out.println(userDto); } }); }
這里以博客網站舉例,比如統計每個月網站前三活躍用戶(按用戶文章發表量評判),使用集合排序操作來使用接口默認方法,對于測試數據如下:
Collections.sort 工具類方法實現排序
System.out.println("--------Collections.sort 實現按文章發表量排序---------");
Collections.sort(uList, new Comparator() { @Override public int compare(UserDto o1, UserDto o2) { return o1.getTotal()-o2.getTotal(); } });
uList.forEach(System.out::println);
增強的List接口默認sort方法
借助Java8增強的List接口默認Sort方法實現集合排序操作
System.out.println("--------集合默認sort方法實現按文章發表量排序---------"); uList.sort(new Comparator() { @Override public int compare(UserDto o1, UserDto o2) { return o1.getTotal()-o2.getTotal(); } }); uList.forEach(System.out::println);
Stream流sorted 方法實現排序(這里先做了解!)
Stream流提供了針對集合的多種操作,這里借助Stream的sorted實現集合元素排序操作,后續會對Stream做詳細介紹。
System.out.println("--------Stream實現按文章發表量排序---------"); Listresult= uList.stream().sorted(new Comparator () { @Override public int compare(UserDto o1, UserDto o2) { return o1.getTotal()-o2.getTotal(); } }).collect(Collectors.toList()); result.forEach(System.out::println);
**
五、接口默認方法與靜態方法的優勢**
接口的兼容性得到解決
使用接口編程的好處是,開發是面向抽象而不再是面向具體來編程,使得程序變得很靈活,缺陷是,當需要修改接口時候,此時對應實現該接口的類需要全部修改,舉個例子,?java 8 之前對于我們常用的集合框架沒有 foreach 方法,通常能想到的解決辦法是在JDK里給相關的接口添加新的方法及實現。從Java8開始,引入了接口默認方法,這樣的好處也是很明顯的,首先解決了Java8以前版本接口兼容性問題,同時對于我們以后的程序開發,也可以在接口子類中直接使用接口默認方法,而不再需要再各個子類中各自實現響應接口方法。
子類在實現接口方法時靈活度更高
子類在實現接口時,可以按需重寫,不在向Java8以前接口方法必須全部實現,同時接口默認方法可以在子類中直接進行調用,靈活度比較高。
開發中避免大量工具類創建
接口中引入靜態方法,對于原有項目開發中出現大量的工具類大量靜態方法的代碼便可以遷移到接口中定義與實現,省去大量工具類的創建。
提升了對Lambda表達式的支持
Lambda 是針對只有一個抽象方法的接口來說的,接口中引入接口默認方法與靜態方法,在對接口這些方法進行調用時,可以引入Lambda表達式簡化了原有代碼的書寫形式,使得代碼變得更加簡潔。
Java8核心特性-接口默認方法就介紹到這里了,后續小樂會繼續講述Java8核心特性。
小樂開通了公眾號:樂字節 歡迎關注
原創所有,轉載請注明出處和作者。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74719.html
摘要:大家好,上一篇小樂給大家講述了樂字節核心特性表達式,點擊回顧。接下來繼續核心特性之函數式接口。感謝大家欣賞小樂帶來的核心特性之函數式接口,接下來還會更多核心技術講解,請關注樂字節如需要視頻課程,請搜索樂字節騰訊課堂 大家好,上一篇小樂給大家講述了《樂字節-Java8核心特性-Lambda表達式》,點擊回顧。接下來繼續:Java8核心特性之函數式接口。 什么時候可以使用Lambda?通常...
摘要:大家好,我是樂字節的小樂,上一次我們說到了核心特性之函數式接口,接下來我們繼續了解又一核心特性方法引用。方法引用是一種更簡潔易懂的表達式。感謝光臨閱讀小樂的,敬請關注樂字節后續將繼續講述等前沿知識技術。 大家好,我是樂字節的小樂,上一次我們說到了Java8核心特性之函數式接口,接下來我們繼續了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...
摘要:使用表達式,使得應用變得簡潔而緊湊。很多語言等從設計之初就支持表達式。表達式的參數與函數式接口內方法的參數,返回值類型相互對應。更多教程和資料請上騰訊課堂樂字節 showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表達式,允許開發者將函數當成參數傳遞給某個方法,或者把代碼本身當作數據進行處理。...
摘要:大家好,我是樂字節的小樂。需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進行鏈式調用,并且并行流還可以實現數據流并行處理操作。為集合創建并行流。 大家好,我是樂字節的小樂。說起流,我們會聯想到手機、電腦組裝流水線,物流倉庫商品包裝流水線等等,如果把手機 ,電腦,包裹看做最終結果的話,那么加工商品前的各種零部件就可以看做數據源,而中間一系列的...
摘要:注意當多個父接口中存在相同的默認方法時,子類中以就近原則繼承。定義靜態默認方法這是版簡易計算器接口默認方法使用定義接口并提供默認打印方法定義接口默認方法支持方法形參這是數值運算基本接口。。。 總概 JAVA8 已經發布很久,而且毫無疑問,java8是自java5(2004年發布)之后的最重要的版本。其中包括語言、編譯器、庫、工具和JVM等諸多方面的新特性。 Java8 新特性列表如下:...
閱讀 3686·2021-11-12 10:36
閱讀 3831·2021-09-22 15:48
閱讀 3542·2019-08-30 15:54
閱讀 2592·2019-08-29 16:44
閱讀 2363·2019-08-29 16:08
閱讀 2408·2019-08-29 16:06
閱讀 1280·2019-08-29 15:21
閱讀 3171·2019-08-29 12:39