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

Java8新特性之默認(rèn)方法詳解

 更新時間:2022年02月16日 11:33:39   作者:湯圓  
JAVA8 所提供的默認(rèn)方法,就是在接口上你可以定義某些方法的實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Java8新特性之默認(rèn)方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

簡介

在Java之前,我們接觸到的接口,都是只定義方法,不實現(xiàn)方法

(你看下面這幾個人,像不像接口)

但是到了Java8就不一樣了,因為在接口中新增了默認(rèn)方法

這樣的話,有些活,就可以交給接口自己去做了,而不用實現(xiàn)類去做(Java你這是在收買人心?。?/p>

我們下面以問答的形式來介紹默認(rèn)方法的相關(guān)知識點(據(jù)說問答模式可以讓人更好地記憶?)

正文

什么是默認(rèn)方法

默認(rèn)方法是接口中用default修飾的方法,其中包含方法內(nèi)容

比如下面這個:

public?interface?InterfaceDemo?{
? ?// 普通方法,只定義,不實現(xiàn)
? ?void?oldFun();
? ?// 默認(rèn)方法,又定義,又實現(xiàn)
? ?default?void?newFun(){
? ? ? ?System.out.println("newFun");
? }
}

為啥要提供默認(rèn)方法呢?

為了向后兼容(這也是導(dǎo)致Java變得臃腫的原因之一)。

因為升級系統(tǒng)時,難免會有一些新功能需要加入,此時如果接口類新增了方法,那么實現(xiàn)類就必須同步修改實現(xiàn);

這樣工作量還是很大的,而且很容易出錯。

所以Java8開始,推出了接口的默認(rèn)方法這個功能,使得接口升級變得更加平滑

比如下面的代碼:InterfaceDemo就是上面那個接口

public?class?UserDemo?implements?InterfaceDemo{
? ?@Override
? ?public?void?oldFun() {
? ? ? ?System.out.println("oldFun");
? }

? ?public?static?void?main(String[]?args) {
? ? ? ?UserDemo?demo?=?new?UserDemo();
? ? ? ?/**
? ? ? ??* InterfaceDemo升級后,新增了newFun方法
? ? ? ??* 但是由于newFun是默認(rèn)方法,有提供實現(xiàn)內(nèi)容
? ? ? ??* 所以這里的子類 UserDemo就可以直接使用
? ? ? ? ?*/
? ? ? ?demo.newFun();
? }
}

我們可以看到,UserDemo沒有實現(xiàn)新的方法newFun(),但是也可以編譯運(yùn)行,并直接調(diào)用newFun()

這就是默認(rèn)方法的好處:對實現(xiàn)類來說是無痛升級的

如果不提供呢?

不提供的話,接口類升級時,系統(tǒng)有兩個選擇

  • 實現(xiàn)類升級:

    • 實現(xiàn)類老老實實地按照接口升級后的方法,進(jìn)行同步修改實現(xiàn),但是工作量大

  • 實現(xiàn)類不升級:

    • 實現(xiàn)類不升級也是可以的,只要不引入接口類的新版本就可以了,那么這個時候系統(tǒng)還是可以運(yùn)行的,這沒啥問題。但是誰能保證一輩子都不更新系統(tǒng)呢?如果更新系統(tǒng)時,接口類庫升級到新版本,那么編譯還是通不過

主要針對誰?

接口的默認(rèn)方法主要是針對類庫設(shè)計者

實現(xiàn)了默認(rèn)方法的接口和抽象類有區(qū)別嗎

區(qū)別沒有之前那么多,但還是有的:

  • 抽象類單繼承,接口類多實現(xiàn)

  • 抽象類中的屬性定義時不需要初始化,接口類的屬性定義時要初始化(默認(rèn)修飾符為public static final)

是不是可以說Java現(xiàn)在也實現(xiàn)了多重繼承?

可以這么說。

但是現(xiàn)在面臨的一個新問題,就是多重繼承帶來的二義性問題,有點類似之前介紹的致命方塊(也叫菱形問題)

如下面的UML圖所示

比如上面這種,你無法知道A會調(diào)用哪個接口的fun方法

所以編譯器會報錯:

com.jalon.java8.defaultmethod.A?inherits?unrelated?defaults?for?fun()?from?types?com.jalon.java8.defaultmethod.B?and?com.jalon.java8.defaultmethod.C

解決辦法:

  • 先覆寫fun方法

  • 再顯示聲明調(diào)用哪個接口的fun方法

代碼如下:

public?class?A?implements?B,C{
? ?@Override
? ?public?void?fun(){
? ? ? ?// 顯示調(diào)用B的默認(rèn)方法
? ? ? ?B.super.fun();
? }

? ?public?static?void?main(String[]?args) {
? ? ? ?A?a?=?new?A();
? ? ? ?// 這里會打印B的fun
? ? ? ?a.fun();
? }
}
interface?D{
? ?default?void?fun(){
? ? ? ?System.out.println("D");
? }
}
interface?B?extends?D{
? ?@Override
? ?default?void?fun(){
? ? ? ?System.out.println("B");
? }
}
interface?C?extends?D{
? ?@Override
? ?default?void?fun(){
? ? ? ?System.out.println("C");
? }
}

總結(jié)

  • 什么是默認(rèn)方法:接口中用default修飾且包含方法內(nèi)容的方法

  • 為什么要提供默認(rèn)方法:向后兼容,使系統(tǒng)平滑過渡;主要針對類庫設(shè)計者

  • 多重繼承帶來的問題:二義性,也叫菱形問題;解決辦法就是子類盡量覆寫默認(rèn)方法并顯式聲明調(diào)用哪個方法(實際上這個問題很少出現(xiàn),因為它屬于編譯錯誤,寫代碼時隨時可以發(fā)現(xiàn))

到此這篇關(guān)于Java8新特性之默認(rèn)方法的文章就介紹到這了,更多相關(guān)Java8默認(rèn)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中fastjson生成和解析json數(shù)據(jù)(序列化和反序列化數(shù)據(jù))

    java中fastjson生成和解析json數(shù)據(jù)(序列化和反序列化數(shù)據(jù))

    本篇文章主要介紹了java中fastjson生成和解析json數(shù)據(jù)(序列化和反序列化數(shù)據(jù)),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 使用springboot時,解決@Scheduled定時器遇到的問題

    使用springboot時,解決@Scheduled定時器遇到的問題

    這篇文章主要介紹了使用springboot時,解決@Scheduled定時器遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java WebService技術(shù)詳解

    Java WebService技術(shù)詳解

    本文詳細(xì)講解了Java WebService技術(shù)工作原理以及調(diào)用方式。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Java中有什么工具可以進(jìn)行代碼反編譯詳解

    Java中有什么工具可以進(jìn)行代碼反編譯詳解

    這篇文章主要介紹了Java中有什么工具可以進(jìn)行代碼反編譯的相關(guān)資,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、BytecodeViewer、Krakatau和JAD,每種工具都有其特點和適用場景,需要的朋友可以參考下
    2025-03-03
  • springboot多環(huán)境進(jìn)行動態(tài)配置的方法

    springboot多環(huán)境進(jìn)行動態(tài)配置的方法

    這篇文章主要介紹了springboot多環(huán)境下如何進(jìn)行動態(tài)配置,本文主要分享了如何在springboot的項目中使用多環(huán)境配置,重點是”spring.profiles.active“屬性,需要的朋友可以參考下
    2022-06-06
  • SpringBoot詳細(xì)分析自動裝配原理并實現(xiàn)starter

    SpringBoot詳細(xì)分析自動裝配原理并實現(xiàn)starter

    相對于傳統(tǒng)意義上的Spring項目,SpringBoot具有開箱即用,簡化配置,內(nèi)置Tomcat等等等等一系列的特點。在這些特點中,最重要的兩條就是約定優(yōu)于配置和自動裝配
    2022-07-07
  • Maven中jar包下載失敗的幾種解決方法

    Maven中jar包下載失敗的幾種解決方法

    本文主要介紹了Maven中jar包下載失敗的幾種解決方法,包括配置國內(nèi)Maven源、刪除本地jar包目錄重新下載,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • java中l(wèi)og使用小結(jié)

    java中l(wèi)og使用小結(jié)

    本文主要介紹了java中l(wèi)og使用小結(jié),一文搞清楚java所有日志框架,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的方法

    Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的方法

    這篇文章主要給大家介紹了關(guān)于Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 使用JSONObject.toJSONString 過濾掉值為空的key

    使用JSONObject.toJSONString 過濾掉值為空的key

    這篇文章主要介紹了使用JSONObject.toJSONString 過濾掉值為空的key,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

桐城市| 余干县| 嘉荫县| 左云县| 贵定县| 格尔木市| 景洪市| 晋城| 阜阳市| 兴海县| 商水县| 满洲里市| 新乡市| 郸城县| 宜君县| 理塘县| 同德县| 泾源县| 宁化县| 朝阳市| 沈阳市| 天气| 彝良县| 道孚县| 博爱县| 信丰县| 湘阴县| 吴川市| 龙川县| 宝清县| 建平县| 三台县| 黎川县| 兴化市| 岳普湖县| 建昌县| 河源市| 锡林郭勒盟| 贡山| 石林| 资溪县|