欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

定義一個(gè)接口

public interface IDemo {
    void func1();
}

類(lèi)CDemo1實(shí)現(xiàn)接口IDemo

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

類(lèi)CDemo2實(shí)現(xiàn)接口IDemo

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

在IDemo中新增加方法func2()

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

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

接口中的default

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

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

其中新增的接口,都用default來(lái)修飾(jdk1.7升級(jí)到j(luò)dk1.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;
}

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

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

然后查看類(lèi)CDemo1,一切正常,沒(méi)有任何錯(cuò)誤提示:

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

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

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

接口中的static

與此同時(shí),從jdk1.8開(kāi)始,接口中可以通過(guò)static關(guān)鍵字來(lái)修飾方法,同樣可以對(duì)方法進(jìn)行實(shí)現(xiàn)

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

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

IDemo.func4();

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

Default好處

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

總結(jié)

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

相關(guān)文章

  • Java構(gòu)造方法和方法重載詳解

    Java構(gòu)造方法和方法重載詳解

    大家好,本篇文章主要講的是Java構(gòu)造方法和方法重載詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Java生成N個(gè)不重復(fù)的隨機(jī)數(shù)的三種方法總結(jié)

    Java生成N個(gè)不重復(fù)的隨機(jī)數(shù)的三種方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了三種Java生成N個(gè)不重復(fù)的隨機(jī)數(shù)的方法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,有需要的可以了解下
    2023-10-10
  • 詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問(wèn)題

    詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問(wèn)題

    這篇文章主要介紹了詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 基于Graphics2D drawImage圖片失真的解決方案

    基于Graphics2D drawImage圖片失真的解決方案

    這篇文章主要介紹了基于Graphics2D drawImage圖片失真的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java編程一道多線程問(wèn)題實(shí)例代碼

    Java編程一道多線程問(wèn)題實(shí)例代碼

    這篇文章主要介紹了Java編程一道多線程問(wèn)題實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • SpringCloud Alibaba 基本開(kāi)發(fā)框架搭建過(guò)程

    SpringCloud Alibaba 基本開(kāi)發(fā)框架搭建過(guò)程

    這篇文章主要介紹了SpringCloud Alibaba 基本開(kāi)發(fā)框架搭建過(guò)程,開(kāi)發(fā)工具選用的idea,本文通過(guò)圖文實(shí)例相結(jié)合給大家分享搭建全過(guò)程,需要的朋友可以參考下
    2021-06-06
  • Java多線程之Worker Thread模式

    Java多線程之Worker Thread模式

    這篇文章主要介紹了Java多線程之Worker Thread模式,Worker的意思是工作的人,在Worker Thread模式中,工人線程Worker thread會(huì)逐個(gè)取回工作并進(jìn)行處理,當(dāng)所有工作全部完成后,工人線程會(huì)等待新的工作到來(lái),下面文章小編回給大家詳細(xì)介紹,需要的朋友可以參考一下
    2021-10-10
  • Resilience4J通過(guò)yml設(shè)置circuitBreaker的方法

    Resilience4J通過(guò)yml設(shè)置circuitBreaker的方法

    Resilience4j是一個(gè)輕量級(jí)、易于使用的容錯(cuò)庫(kù),其靈感來(lái)自Netflix Hystrix,但專(zhuān)為Java 8和函數(shù)式編程設(shè)計(jì),這篇文章主要介紹了Resilience4J通過(guò)yml設(shè)置circuitBreaker的方法,需要的朋友可以參考下
    2022-10-10
  • java獲取本月日歷表的方法

    java獲取本月日歷表的方法

    這篇文章主要為大家詳細(xì)介紹了java獲取本月日歷表的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論