亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

簡(jiǎn)介

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

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

但是到了Java8就不一樣了,因?yàn)樵诮涌谥行略隽?strong>默認(rèn)方法

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

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

正文

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

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

比如下面這個(gè):

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

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

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

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

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

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

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

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

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

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

這就是默認(rèn)方法的好處:對(duì)實(shí)現(xiàn)類來(lái)說(shuō)是無(wú)痛升級(jí)的

如果不提供呢?

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

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

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

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

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

主要針對(duì)誰(shuí)?

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

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

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

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

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

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

可以這么說(shuō)。

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

如下面的UML圖所示

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

所以編譯器會(huì)報(bào)錯(cuò):

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

解決辦法:

  • 先覆寫(xiě)fun方法

  • 再顯示聲明調(diào)用哪個(gè)接口的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();
? ? ? ?// 這里會(huì)打印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)平滑過(guò)渡;主要針對(duì)類庫(kù)設(shè)計(jì)者

  • 多重繼承帶來(lái)的問(wèn)題:二義性,也叫菱形問(wèn)題;解決辦法就是子類盡量覆寫(xiě)默認(rèn)方法并顯式聲明調(diào)用哪個(gè)方法(實(shí)際上這個(gè)問(wèn)題很少出現(xiàn),因?yàn)樗鼘儆诰幾g錯(cuò)誤,寫(xiě)代碼時(shí)隨時(shí)可以發(fā)現(xiàn))

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

相關(guān)文章

  • 不寫(xiě)mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問(wèn)題分析

    不寫(xiě)mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問(wèn)題分析

    這篇文章主要為大家介紹了不寫(xiě)mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 解決java.net.SocketTimeoutException: Read timed out的問(wèn)題

    解決java.net.SocketTimeoutException: Read timed out的問(wèn)題

    這篇文章主要介紹了解決java.net.SocketTimeoutException: Read timed out的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java 對(duì)象參數(shù)去空格方式代碼實(shí)例

    java 對(duì)象參數(shù)去空格方式代碼實(shí)例

    這篇文章主要介紹了java 對(duì)象參數(shù)去空格方式代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringMVC @RequestMapping注解應(yīng)用方法示例講解

    SpringMVC @RequestMapping注解應(yīng)用方法示例講解

    通過(guò)@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Java中的List接口實(shí)現(xiàn)類解析

    Java中的List接口實(shí)現(xiàn)類解析

    這篇文章主要介紹了Java中的List接口實(shí)現(xiàn)類解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn)

    Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn)

    本文主要介紹了Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • SpringBoot+redis配置及測(cè)試的方法

    SpringBoot+redis配置及測(cè)試的方法

    這篇文章主要介紹了SpringBoot+redis配置及測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解基于java的Socket聊天程序——客戶端(附demo)

    詳解基于java的Socket聊天程序——客戶端(附demo)

    這篇文章主要介紹了詳解基于java的Socket聊天程序——客戶端(附demo),客戶端設(shè)計(jì)主要分成兩個(gè)部分,分別是socket通訊模塊設(shè)計(jì)和UI相關(guān)設(shè)計(jì)。有興趣的可以了解一下。
    2016-12-12
  • Java Array與ArrayList區(qū)別詳解

    Java Array與ArrayList區(qū)別詳解

    這篇文章主要介紹了Java Array與ArrayList區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作

    java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作

    這篇文章主要介紹了java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論