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

Java8新特性之默認(rèn)方法(default)淺析

 更新時(shí)間:2014年06月09日 11:10:15   作者:  
這篇文章主要介紹了Java8新特性之默認(rèn)方法(default)淺析,默認(rèn)方法也稱為虛擬擴(kuò)展方法或防護(hù)方法,可以讓我們修改接口而不破壞原來的實(shí)現(xiàn)類的結(jié)構(gòu),需要的朋友可以參考下

一、什么是默認(rèn)方法,為什么要有默認(rèn)方法

簡單說,就是接口可以有實(shí)現(xiàn)方法,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法。只需在方法名前面加個(gè)default關(guān)鍵字即可。

為什么要有這個(gè)特性?首先,之前的接口是個(gè)雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當(dāng)需要修改接口時(shí)候,需要修改全部實(shí)現(xiàn)該接口的類,目前的java 8之前的集合框架沒有foreach方法,通常能想到的解決辦法是在JDK里給相關(guān)的接口添加新的方法及實(shí)現(xiàn)。然而,對(duì)于已經(jīng)發(fā)布的版本,是沒法在給接口添加新方法的同時(shí)不影響已有的實(shí)現(xiàn)。所以引進(jìn)的默認(rèn)方法。他們的目的是為了解決接口的修改與現(xiàn)有的實(shí)現(xiàn)不兼容的問題。

簡單的例子:一個(gè)接口A,Clazz類實(shí)現(xiàn)了接口A。

復(fù)制代碼 代碼如下:

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class Clazz implements A {
    public static void main(String[] args){
       Clazz clazz = new Clazz();
       clazz.foo();//調(diào)用A.foo()
    }
}


代碼是可以編譯的,即使Clazz類并沒有實(shí)現(xiàn)foo()方法。在接口A中提供了foo()方法的默認(rèn)實(shí)現(xiàn)。

二、java 8抽象類與接口對(duì)比


這一個(gè)功能特性出來后,很多同學(xué)都反應(yīng)了,java 8的接口都有實(shí)現(xiàn)方法了,跟抽象類還有什么區(qū)別?其實(shí)還是有的,請(qǐng)看下表對(duì)比。。

相同點(diǎn) 不同點(diǎn)

1.都是抽象類型;

2.都可以有實(shí)現(xiàn)方法(以前接口不行);

3.都可以不需要實(shí)現(xiàn)類或者繼承者去實(shí)現(xiàn)所有方法,(以前不行,現(xiàn)在接口中默認(rèn)方法不需要實(shí)現(xiàn)者實(shí)現(xiàn))

1.抽象類不可以多重繼承,接口可以(無論是多重類型繼承還是多重行為繼承);

2.抽象類和接口所反映出的設(shè)計(jì)理念不同。其實(shí)抽象類表示的是"is-a"關(guān)系,接口表示的是"like-a"關(guān)系;

3.接口中定義的變量默認(rèn)是public static final 型,且必須給其初值,所以實(shí)現(xiàn)類中不能重新定義,也不能改變其值;抽象類中的變量默認(rèn)是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。


三、多重繼承的沖突說明

由于同一個(gè)方法可以從不同接口引入,自然而然的會(huì)有沖突的現(xiàn)象,默認(rèn)方法判斷沖突的規(guī)則如下:

1.一個(gè)聲明在類里面的方法優(yōu)先于任何默認(rèn)方法(classes always win)

2.否則,則會(huì)優(yōu)先選取最具體的實(shí)現(xiàn),比如下面的例子 B重寫了A的hello方法。

輸出結(jié)果是:Hello World from B

如果想調(diào)用A的默認(rèn)函數(shù),則用到新語法X.super.m(...),下面修改C類,實(shí)現(xiàn)A接口,重寫一個(gè)hello方法,如下所示:

復(fù)制代碼 代碼如下:

public class C implements A{

    @Override
    public void hello(){
        A.super.hello();
    }

    public static void main(String[] args){
        new C().hello();
    }
}

輸出結(jié)果是:Hello World from A

四、總結(jié)

默認(rèn)方法給予我們修改接口而不破壞原來的實(shí)現(xiàn)類的結(jié)構(gòu)提供了便利,目前java 8的集合框架已經(jīng)大量使用了默認(rèn)方法來改進(jìn)了,當(dāng)我們最終開始使用Java 8的lambdas表達(dá)式時(shí),提供給我們一個(gè)平滑的過渡體驗(yàn)。也許將來我們會(huì)在API設(shè)計(jì)中看到更多的默認(rèn)方法的應(yīng)用。

相關(guān)文章

  • SpringCloud集成Sleuth和Zipkin的思路講解

    SpringCloud集成Sleuth和Zipkin的思路講解

    Zipkin 是 Twitter 的一個(gè)開源項(xiàng)目,它基于 Google Dapper 實(shí)現(xiàn),它致力于收集服務(wù)的定時(shí)數(shù)據(jù),以及解決微服務(wù)架構(gòu)中的延遲問題,包括數(shù)據(jù)的收集、存儲(chǔ)、查找和展現(xiàn),這篇文章主要介紹了SpringCloud集成Sleuth和Zipkin,需要的朋友可以參考下
    2022-11-11
  • Java設(shè)計(jì)模式之淺談外觀模式

    Java設(shè)計(jì)模式之淺談外觀模式

    這篇文章主要介紹了Java設(shè)計(jì)模式之外觀模式的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • IDEA自定義pom依賴的步驟詳解

    IDEA自定義pom依賴的步驟詳解

    這篇文章主要介紹了IDEA自定義pom依賴的步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 使用SpringBoot發(fā)送郵箱驗(yàn)證碼的簡單實(shí)現(xiàn)

    使用SpringBoot發(fā)送郵箱驗(yàn)證碼的簡單實(shí)現(xiàn)

    這篇文章主要介紹了使用SpringBoot發(fā)送郵箱驗(yàn)證碼的簡單實(shí)現(xiàn),咱們今天來講使用QQ郵箱來發(fā)送和接收驗(yàn)證碼,首先來介紹一下它在SpringBoot項(xiàng)目中的具體應(yīng)用,需要的朋友可以參考下
    2023-04-04
  • java生成圖片驗(yàn)證碼示例代碼

    java生成圖片驗(yàn)證碼示例代碼

    這篇文章主要為大家詳細(xì)介紹了java生成圖片驗(yàn)證碼示例代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java遍歷Json中的key和value問題

    Java遍歷Json中的key和value問題

    這篇文章主要介紹了Java遍歷Json中的key和value問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • spring mvc中@RequestBody注解的作用說明

    spring mvc中@RequestBody注解的作用說明

    這篇文章主要介紹了spring mvc中@RequestBody注解的作用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java實(shí)戰(zhàn)項(xiàng)目之記賬軟件

    java實(shí)戰(zhàn)項(xiàng)目之記賬軟件

    這篇文章主要介紹了java實(shí)戰(zhàn)項(xiàng)目之記賬軟件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java性能調(diào)優(yōu)及排查方式

    Java性能調(diào)優(yōu)及排查方式

    這篇文章主要介紹了Java性能調(diào)優(yōu)及排查方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java獲取彩色圖像中的主色彩的實(shí)例代碼

    Java獲取彩色圖像中的主色彩的實(shí)例代碼

    這篇文章主要介紹了Java獲取彩色圖像中的主色彩的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05

最新評(píng)論