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

服務(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)用。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩精品一区二区三区视频 | 暖暖在线精品日本中文 | 亚洲国产日韩成人综合天堂 | 四虎精品成人免费影视 | 亚洲欧美成人中文在线网站 | 精品国产精品国产 | 日韩精品福利视频一区二区三区 | 国产探花在线观看 | 丝袜足液精子免费视频 | gay 男同志被捆绑茎 | 亚洲精品久久久久69影院 | 97影院秋霞国产精品 | 国产麻豆91欧美一区二区 | 国产精品亚洲专区一区 | 俄罗斯激情性孕妇孕交大全 | 99在线在线视频免费视频观看 | 国产精品怡红院在线观看 | 欧美男男gaygaysxxx | 日韩一区国产二区欧美三 | 耽美肉文高h | 日韩亚洲国产激情在线观看 | 欧美国产日本精品一区二区三区 | 乌克兰肛交影视 | 亚洲阿v天堂在线2017 | 91久久夜色精品国产九色 | 日本中文字幕在线观看视频 | 日韩毛片在线 | 男人操女人免费视频 | 亚洲成人网在线 | 欧美国产日产精品免费视频 | 91系列在线观看免费 | 精品无码乱码AV | 女同videos双性人 | 国产精品视频2021 | 草莓茄子丝瓜番茄小蝌蚪 | 精品久久伦理中文字幕 | 国产精品久久久久久搜索 | 窝窝影院午夜色在线视频 | 黄 在线播放 | 国内小情侣一二三区在线视频 | 羞羞答答影院在线 |