default怎麼修飾接口中的方法詳解
一、default修飾接口中的方法
在實現HandlerInterceptor接口時,我發現不實現HandlerInterceptor接口的方法也不會報錯
仔細想來,還是我對接口的理解不清晰。
打開源碼發現HandlerInterceptor接口中的方法都是default
在以前的接口編寫中,我總是省略權限修飾符,因為在接口中的方法中默認是public abstract。
那麼再來對接口進行總結。
那麼也就是說,實現類要覆蓋接口中的抽象方法就能實例化,而HandlerInterceptor接口中的方法都是default
在JDK8增加的default修飾接口方法時,有什麼作用呢?
實現類會繼承接口中的default方法
還有兩個要註意的點
一言以蔽之,更接近實現類的優先級更高,如: 實現類 > 抽象類 > 接口
1. 如果一個類同時實現接口A和B,接口A和B中有相同的default方法,這時,該類必須重寫接口中的default方法
2. 如果子類繼承父類,父類中有b方法,該子類同時實現的接口中也有b方法(被default修飾),那麼子類會繼承父類的b方法而不是繼承接口中的b方法
二、Java中的“多繼承“?
在學習C++時,多繼承會帶來非常著名的菱形繼承問題
那麼為什麼Java接口為何能多繼承?
1.Java接口是行為性的,也就是說接口隻是定義某個行為的名稱
2.具體的實現動作,都在實現類本身這裡。
從JDK8開始,接口中可以寫default方法瞭。這其實是java自己就給自己出瞭一個問題。
接口可以書寫默認方法瞭,然後又因為接口之間是可以多繼承的,因而實質上Java 8的接口多繼承其實也會涉及到實現多繼承的問題。
解決接口default方法沖突的三步驟:
- 方法簽名相同時,才表示出現瞭沖突。
- 類中的方法優先級最高。類或者父類中的方法實現優先級大於任何接口的默認方法
- 其實,子接口的默認方法優先級更高。
- 若最終還是無法判斷,那麼實現類必須通過顯示復寫的方式復寫默認方法,然後再自己通過xxx.super.xxx()的方式來指定具體使用哪個接口的實現
總之,Java8在語言層面上,對若出現接口default方法沖突的解決方案是:不作為。其實不作為也是一種作為,它讓編譯器去提示調用者必須顯示的override這個沖突的方法,讓coder自己去決定調用邏輯
三、關於抽象類與接口的思考
如果現在問我接口和抽象類有什麼區別,我會覺得去說兩者之間具體的使用細節是舍本逐末瞭,應該從設計理念出發。
於是引出我對此的理解。
抽象類:抽象體,對於個體(事物)的抽象。
接口:抽象面,對於事物某一特性(行為)的抽象。接口隻是定義某個行為的名稱。
在Java的設計中,經常可以看到兩者組合起來使用。如Servlet
什麼叫Servlet?實現瞭Servlet接口的類就是一個Servlet。
可以發現,抽象類GenericServlet實現瞭Servlet接口。
接口的好處是什麼?
規范。
抽象類的好處是什麼?
捕捉子類的通用特性,減少冗餘代碼,同時起到規范的作用。
這樣兩者結合起來的好處是什麼(GenericServlet)?
規范,同時減少瞭編程人員的所需要編寫的代碼,抽象類給出模板。
到此這篇關於default怎麼修飾接口中的方法詳解的文章就介紹到這瞭,更多相關default修飾方法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Servlet方法生命周期及執行原理詳解
- Java中的封裝、繼承和多態,你真的都懂瞭嗎
- Java日常練習題,每天進步一點點(59)
- 一篇文章帶你深入瞭解Java對象與Java類
- 手工搭建Servlet實現