最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8接口中引入default關鍵字的本質(zhì)原因詳析

 更新時間:2022年01月06日 10:45:59   作者:測試開發(fā)Kevin  
Default方法是在java8中引入的關鍵字,也可稱為Virtual extension methods—虛擬擴展方法,這篇文章主要給大家介紹了關于Java8接口中引入default關鍵字的本質(zhì)原因,需要的朋友可以參考下

接口的常規(guī)實現(xiàn)方式

熟悉java接口的同學都知道,接口被某些類實現(xiàn)后,一旦在接口中增加了新方法,那么實現(xiàn)該接口的所有類都要實現(xiàn)這個新增的方法(即使這個新增的接口對某些類沒有用處)。

定義一個接口

public interface IDemo {
    void func1();
}

類CDemo1實現(xiàn)接口IDemo

public class CDemo1 implements IDemo{
    @Override
    public void func1() {
    }
}

類CDemo2實現(xiàn)接口IDemo

public class CDemo2 implements IDemo{
    @Override
    public void func1() {
    }
}

在IDemo中新增加方法func2()

public interface IDemo {
    void func1();
    void func2();
}

可以看到CDemo1和CDemo2中需要強制實現(xiàn)方法func2(),如下圖所示:

接口中的default

上面的實例導致了前面提出的那個問題,一旦在接口中增加了新方法,那么已經(jīng)實現(xiàn)了該接口的所有的類都要實現(xiàn)這個新增的方法!那么,如果是JDK中的某個核心接口需要變更,需要新增某些方法呢?這個工作量更是可想而知,我們來看一下java.util.Collection這個接口,它在jdk1.7中的方法包括:

而在JDk 1.8中 Collection接口中包括方法如下:

其中新增的接口,都用default來修飾(jdk1.7升級到jdk1.8后,接口的重要變化),源代碼如下:

default Stream<E> stream() {
?return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
? ? return StreamSupport.stream(spliterator(), true);
}

default Spliterator<E> spliterator() {
? ? return Spliterators.spliterator(this, 0);
}

default boolean removeIf(Predicate<? super E> filter) {
? ? Objects.requireNonNull(filter);
? ? boolean removed = false;
? ? final Iterator<E> each = iterator();
? ? while (each.hasNext()) {
? ? ? ? if (filter.test(each.next())) {
? ? ? ? ? ? each.remove();
? ? ? ? ? ? removed = true;
? ? ? ? }
? ? }
? ? return removed;
}

我們不僅大吃一驚,這還是我們熟知的接口嗎?接口中的方法居然有了實現(xiàn)代碼!吃驚過后,我們來想想作者的意圖。還是上面的代碼,我們新增方法func3(),并完成簡單的實現(xiàn)

public interface IDemo {
    void func1();
    void func2();
    default void func3(){
        System.out.println("this is default func2");
    }
}

然后查看類CDemo1,一切正常,沒有任何錯誤提示:

實例化CDemo1后,可以正常調(diào)用func3方法,代碼如下:

public static void main(String[] args) {
    CDemo1 cd1=new CDemo1();
    cd1.func3();
}

讀到這里發(fā)現(xiàn)接口中通過default關鍵字來進行接口實現(xiàn)的好處了吧,簡單四個字就是 “方便擴展” !通過這個技術可以做到在接口中新增加方法并且不會影響到已經(jīng)實現(xiàn)了該接口的所有的類!包括jdk1.8新引入的Lambda表達式也是基于這一知識點來實現(xiàn)的!

接口中的static

與此同時,從jdk1.8開始,接口中可以通過static關鍵字來修飾方法,同樣可以對方法進行實現(xiàn)

static  void func4(){
    System.out.println("this is static func4");
}

調(diào)用方法也非常的簡單,接口.static 方法,例如:

IDemo.func4();

大家可以這樣理解,接口中的static方法可以作為工具方法來提供給大家進行方便調(diào)用!

Default好處

原先接口的缺陷是,修改接口后,則需要修改全部實現(xiàn)該接口的類,所以引進的默認方法。他們的目的是為了解決接口的修改與現(xiàn)有的實現(xiàn)不兼容的問題。

總結(jié)

到此這篇關于Java8接口中引入default關鍵字本質(zhì)原因的文章就介紹到這了,更多相關Java8接口引入default關鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家

相關文章

  • java清除html轉(zhuǎn)義字符

    java清除html轉(zhuǎn)義字符

    這篇文章主要介紹了一個靜態(tài)文件處理的一些便捷服務,包括 java清除html轉(zhuǎn)義字符,清除html代碼,從style樣式中讀取CSS的屬性,將字符串截取指定長度,涉及l(fā)og4j,common-lang類的學習
    2014-01-01
  • 使用SpringAop動態(tài)獲取mapper執(zhí)行的SQL,并保存SQL到Log表中

    使用SpringAop動態(tài)獲取mapper執(zhí)行的SQL,并保存SQL到Log表中

    這篇文章主要介紹了使用SpringAop動態(tài)獲取mapper執(zhí)行的SQL,并保存SQL到Log表中問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳細分析Java內(nèi)存模型

    詳細分析Java內(nèi)存模型

    Java虛擬機規(guī)范中定義了Java內(nèi)存模型(Java Memory Model,JMM),用于屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異,以實現(xiàn)讓Java程序在各種平臺下都能達到一致的并發(fā)效果,JMM規(guī)范了Java虛擬機與計算機內(nèi)存是如何協(xié)同工作的,以及在必須時如何同步的訪問共享變量
    2021-06-06
  • SpringBoot自定義對象參數(shù)實現(xiàn)自動類型轉(zhuǎn)換與格式化

    SpringBoot自定義對象參數(shù)實現(xiàn)自動類型轉(zhuǎn)換與格式化

    SpringBoot 通過自定義對象參數(shù),可以實現(xiàn)自動類型轉(zhuǎn)換與格式化,并可以級聯(lián)封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • 基于SpringBoot核心原理(自動配置、事件驅(qū)動、Condition)

    基于SpringBoot核心原理(自動配置、事件驅(qū)動、Condition)

    這篇文章主要介紹了基于SpringBoot核心原理(自動配置、事件驅(qū)動、Condition),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • JAVA獲得包含0-9、a-z、A-Z范圍內(nèi)字符串的的隨機數(shù)實例

    JAVA獲得包含0-9、a-z、A-Z范圍內(nèi)字符串的的隨機數(shù)實例

    這篇文章主要介紹了JAVA獲得包含0-9、a-z、A-Z范圍內(nèi)字符串的的隨機數(shù)實例,包含隨機數(shù)字、隨機字符串的獲取方法,需要的朋友可以參考下
    2014-07-07
  • 顯示SonarQube私有項目徽章方案流程

    顯示SonarQube私有項目徽章方案流程

    這篇文章主要為大家介紹了如何顯示SonarQube私有項目徽章方案的流程,sonarQube目前不支持私有項目的徽章圖片獲取,這個問題早在?2018年就在sonar社區(qū)里有過激烈的討論,至今無果,只能自己尋求一種可以快速實施的方案
    2022-02-02
  • spring mvc實現(xiàn)文件上傳并攜帶其他參數(shù)的示例

    spring mvc實現(xiàn)文件上傳并攜帶其他參數(shù)的示例

    本篇文章主要介紹了spring mvc實現(xiàn)文件上傳并攜帶其他參數(shù)的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • SSH框架網(wǎng)上商城項目第4戰(zhàn)之EasyUI菜單的實現(xiàn)

    SSH框架網(wǎng)上商城項目第4戰(zhàn)之EasyUI菜單的實現(xiàn)

    SSH框架網(wǎng)上商城項目第4戰(zhàn)之EasyUI菜單的實現(xiàn),本文主要使用EasyUI技術簡單實現(xiàn)后臺菜單,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java啟動命令大全(匯總)

    Java啟動命令大全(匯總)

    Java啟動命令是所有java應用程序的入口,通過它來啟動Java運行時環(huán)境,并加載相關的class,本文希望做一個Java啟動命令的匯總,和各位同道分享,也便于日后作為自己的參考
    2023-09-09

最新評論

德令哈市| 瓮安县| 前郭尔| 金坛市| 阳谷县| 綦江县| 宜兰县| 法库县| 澄城县| 友谊县| 攀枝花市| 布尔津县| 绵竹市| 页游| 凤凰县| 宜黄县| 云浮市| 奉化市| 呼玛县| 湄潭县| 潼关县| 武汉市| 渭源县| 正蓝旗| 含山县| 庆元县| 家居| 禄丰县| 泰兴市| 普兰县| 嵊泗县| 若羌县| 隆尧县| 库尔勒市| 东港市| 萨嘎县| 泉州市| 宁远县| 邯郸县| 镇安县| 林州市|