一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java8新特性之默認(rèn)方法(default)淺析

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

2019-11-23 17:25Java教程網(wǎng) JAVA教程

這篇文章主要介紹了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)。然而,對于已經(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抽象類與接口對比


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

 

相同點(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方法。
Java8新特性之默認(rèn)方法(default)淺析

輸出結(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)用。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品久久久成人 | 美女视频久久 | 日本免费不卡在线一区二区三区 | 欧美一区二区三区精品影视 | 好吊妞视频998www | 精品日本三级在线观看视频 | 亚洲午夜精品久久久久久人妖 | 久草色视频 | 色戒西瓜 | 午夜精品久久久久久中宇 | 欧美一级视频免费观看 | japanesepooping脱粪 | 美女光屁股网站 | 学校捏奶揉下面污文h | 精品综合久久久久久8888 | 人与动人物性行为zozo共患病 | 日本视频在线观看播放 | 男人的天堂视频 | 成人资源在线观看 | 99热这里只有精品久久免费 | 色综合天天综合网站中国 | 四虎影院4hu | 国产精品露脸国语对白99 | 99久热只有精品视频免费看 | 情侣宾馆愉拍自拍视频 | 亚洲色大成网站www久久九九 | 久久不射网 | 黑人开嫩苞 | 超级乱淫伦短篇小说做车 | 亚洲AV蜜桃永久无码精品红樱桃 | 色欧美在线 | 王者荣耀瑶白色液体 | 高h禁伦奶水女 | 国内精品中文字幕 | 色屁屁www | 性插图动态图无遮挡 | 亚洲高清一区二区三区四区 | 动漫美女被褥吸奶漫画漫画 | 香蕉eeww99国产精品 | 亚洲欧美日韩精品久久亚洲区 | 成人激情|