default怎么修飾接口中的方法詳解
一、default修飾接口中的方法
在實(shí)現(xiàn)HandlerInterceptor接口時(shí),我發(fā)現(xiàn)不實(shí)現(xiàn)HandlerInterceptor接口的方法也不會(huì)報(bào)錯(cuò)

仔細(xì)想來(lái),還是我對(duì)接口的理解不清晰。
打開源碼發(fā)現(xiàn)HandlerInterceptor接口中的方法都是default

在以前的接口編寫中,我總是省略權(quán)限修飾符,因?yàn)樵诮涌谥械?strong>方法中默認(rèn)是public abstract。
那么再來(lái)對(duì)接口進(jìn)行總結(jié)。

那么也就是說(shuō),實(shí)現(xiàn)類要覆蓋接口中的抽象方法就能實(shí)例化,而HandlerInterceptor接口中的方法都是default
在JDK8增加的default修飾接口方法時(shí),有什么作用呢?
實(shí)現(xiàn)類會(huì)繼承接口中的default方法
還有兩個(gè)要注意的點(diǎn)
一言以蔽之,更接近實(shí)現(xiàn)類的優(yōu)先級(jí)更高,如: 實(shí)現(xiàn)類 > 抽象類 > 接口
1. 如果一個(gè)類同時(shí)實(shí)現(xiàn)接口A和B,接口A和B中有相同的default方法,這時(shí),該類必須重寫接口中的default方法
2. 如果子類繼承父類,父類中有b方法,該子類同時(shí)實(shí)現(xiàn)的接口中也有b方法(被default修飾),那么子類會(huì)繼承父類的b方法而不是繼承接口中的b方法
二、Java中的“多繼承“?
在學(xué)習(xí)C++時(shí),多繼承會(huì)帶來(lái)非常著名的菱形繼承問(wèn)題
那么為什么Java接口為何能多繼承?
1.Java接口是行為性的,也就是說(shuō)接口只是定義某個(gè)行為的名稱
2.具體的實(shí)現(xiàn)動(dòng)作,都在實(shí)現(xiàn)類本身這里。
從JDK8開始,接口中可以寫default方法了。這其實(shí)是java自己就給自己出了一個(gè)問(wèn)題。
接口可以書寫默認(rèn)方法了,然后又因?yàn)?strong>接口之間是可以多繼承的,因而實(shí)質(zhì)上Java 8的接口多繼承其實(shí)也會(huì)涉及到實(shí)現(xiàn)多繼承的問(wèn)題。
解決接口default方法沖突的三步驟:
- 方法簽名相同時(shí),才表示出現(xiàn)了沖突。
- 類中的方法優(yōu)先級(jí)最高。類或者父類中的方法實(shí)現(xiàn)優(yōu)先級(jí)大于任何接口的默認(rèn)方法
- 其實(shí),子接口的默認(rèn)方法優(yōu)先級(jí)更高。
- 若最終還是無(wú)法判斷,那么實(shí)現(xiàn)類必須通過(guò)顯示復(fù)寫的方式復(fù)寫默認(rèn)方法,然后再自己通過(guò)xxx.super.xxx()的方式來(lái)指定具體使用哪個(gè)接口的實(shí)現(xiàn)
總之,Java8在語(yǔ)言層面上,對(duì)若出現(xiàn)接口default方法沖突的解決方案是:不作為。其實(shí)不作為也是一種作為,它讓編譯器去提示調(diào)用者必須顯示的override這個(gè)沖突的方法,讓coder自己去決定調(diào)用邏輯
三、關(guān)于抽象類與接口的思考
如果現(xiàn)在問(wèn)我接口和抽象類有什么區(qū)別,我會(huì)覺得去說(shuō)兩者之間具體的使用細(xì)節(jié)是舍本逐末了,應(yīng)該從設(shè)計(jì)理念出發(fā)。
于是引出我對(duì)此的理解。
抽象類:抽象體,對(duì)于個(gè)體(事物)的抽象。
接口:抽象面,對(duì)于事物某一特性(行為)的抽象。接口只是定義某個(gè)行為的名稱。
在Java的設(shè)計(jì)中,經(jīng)常可以看到兩者組合起來(lái)使用。如Servlet
什么叫Servlet?實(shí)現(xiàn)了Servlet接口的類就是一個(gè)Servlet。

可以發(fā)現(xiàn),抽象類GenericServlet實(shí)現(xiàn)了Servlet接口。
接口的好處是什么?
規(guī)范。
抽象類的好處是什么?
捕捉子類的通用特性,減少冗余代碼,同時(shí)起到規(guī)范的作用。
這樣兩者結(jié)合起來(lái)的好處是什么(GenericServlet)?
規(guī)范,同時(shí)減少了編程人員的所需要編寫的代碼,抽象類給出模板。
到此這篇關(guān)于default怎么修飾接口中的方法詳解的文章就介紹到這了,更多相關(guān)default修飾方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java map.getOrDefault()方法的用法詳解
- python字典setdefault方法和get方法使用實(shí)例
- python 字典 setdefault()和get()方法比較詳解
- Java 8中default方法能做什么?不能做什么?
- Python使用defaultdict讀取文件各列的方法
- Python中字典的setdefault()方法教程
- python錯(cuò)誤:AttributeError: ''module'' object has no attribute ''setdefaultencoding''問(wèn)題的解決方法
- Java8新特性之默認(rèn)方法(default)淺析
相關(guān)文章
在Spring-Boot中如何使用@Value注解注入集合類
這篇文章主要介紹了在Spring-Boot中如何使用@Value注解注入集合類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java8新特性-lambda表達(dá)式入門學(xué)習(xí)心得
這篇文章主要介紹了java8新特性-lambda表達(dá)式入門學(xué)習(xí)心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java利用redis實(shí)現(xiàn)防止接口重復(fù)提交
本文主要為大家詳細(xì)介紹了Java如何利用redis實(shí)現(xiàn)防止接口重復(fù)提交,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11
MyBatis-Flex實(shí)現(xiàn)分頁(yè)查詢的示例代碼
在MyBatis-Flex中實(shí)現(xiàn)分頁(yè)查詢時(shí),需要注意維護(hù)一個(gè)獲取數(shù)據(jù)庫(kù)總數(shù)的方法,詳細(xì)介紹了UserService、UserServiceImpl類以及Mapper.xml配置,感興趣的可以了解一下2024-10-10
RestTemplate的DELETE及PUT等請(qǐng)求方法使用精講
這篇文章主要為大家介紹了RestTemplate的DELETE及PUT等請(qǐng)求方法的使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
ScheduledExecutorService任務(wù)定時(shí)代碼示例
這篇文章主要介紹了ScheduledExecutorService任務(wù)定時(shí)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼
這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Java超詳細(xì)講解設(shè)計(jì)模式之一的單例模式
單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式2022-03-03
SpringBoot整合jasypt實(shí)現(xiàn)重要數(shù)據(jù)加密
Jasypt是一個(gè)專注于簡(jiǎn)化Java加密操作的開源工具,這篇文章主要為大家介紹了詳細(xì)介紹了如何使用jasypt實(shí)現(xiàn)重要數(shù)據(jù)加密,感興趣的小伙伴可以了解下2025-03-03

