-
默認(rèn)方法
Java 8中的接口現(xiàn)在支持在聲明方法的同時(shí)提供實(shí)現(xiàn)。通過兩種方式可以完成這種操作。其一,Java 8允許在接口內(nèi)聲明靜態(tài)方法。其二,Java 8引入了一個(gè)新功能,叫默認(rèn)方法,通過默認(rèn)方法可以指定接口方法的默認(rèn)實(shí)現(xiàn)。換句話說,接口能提供方法的具體實(shí)現(xiàn)。因此,實(shí)現(xiàn)接口的類如果不顯式地提供該方法的具體實(shí)現(xiàn),就會(huì)自動(dòng)繼承默認(rèn)的實(shí)現(xiàn)。
默認(rèn)方法由default修飾符修飾,并像類中聲明其他方法一樣包含方法體,是一種以源碼兼容方式向接口內(nèi)添加實(shí)現(xiàn)的方法。Java8中抽象類和抽象接口:
- 一個(gè)類只能繼承一個(gè)抽象類,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。
- 一個(gè)抽象類可以通過實(shí)例變量(字段)保存一個(gè)通用狀態(tài),而接口是不能有實(shí)例變量的。
-
使用模式
可選方法/行為的多繼承interface Iterator<T> { boolean hasNext(); T next(); default void remove() { throw new UnsupportedOperationException(); } }采用默認(rèn)方法之后,可以為這種類型的方法提供一個(gè)默認(rèn)的實(shí)現(xiàn),這樣實(shí)體類就無需在自己的實(shí)現(xiàn)中顯式地提供一個(gè)空方法。
-
解決現(xiàn)一個(gè)類繼承了多個(gè)方法而它們使用的卻是同樣的函數(shù)簽名
例如:public interface A { default void hello() { System.out.println("Hello from A"); } } public interface B extends A { default void hello() { System.out.println("Hello from B"); } } public class C implements B, A { public static void main(String... args) { new C().hello(); } } //由于B比A更具體,所以應(yīng)該選擇B的hello方法。所以,程序會(huì)打印輸出“Hellofrom B”類中的方法優(yōu)先級(jí)最高。類或父類中聲明的方法的優(yōu)先級(jí)高于任何聲明為默認(rèn)方法的優(yōu)先級(jí)。
如果無法依據(jù)第一條進(jìn)行判斷,那么子接口的優(yōu)先級(jí)更高:函數(shù)簽名相同時(shí),優(yōu)先選擇擁有最具體實(shí)現(xiàn)的默認(rèn)方法的接口,即如果B繼承了A,那么B就比A更加具體。
-
最后,如果還是無法判斷,繼承了多個(gè)接口的類必須通過顯式覆蓋和調(diào)用期望的方法,顯式地選擇使用哪一個(gè)默認(rèn)方法的實(shí)現(xiàn)。
public class D implements A{ } public class C extends D implements B, A { public static void main(String... args) { new C().hello(); } } //程序會(huì)打印輸出“Hello from B”
依據(jù)規(guī)則(1),類中聲明的方法具有更高的優(yōu)先級(jí)。D并未覆蓋hello方法,可是它實(shí)現(xiàn)了接口A。所以它就擁有了接口A的默認(rèn)方法。規(guī)則(2)說如果類或者父類沒有對(duì)應(yīng)的方法,那么就應(yīng)該選擇提供了最具體實(shí)現(xiàn)的接口中的方法。因此,編譯器會(huì)在接口A和接口B的hello方法之間做選擇。由于B更加具體,所以程序會(huì)再次打印輸出“Hello from B”。
默認(rèn)方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
- 在前面的文章中,我們學(xué)習(xí)了 Lambda 表達(dá)式和函數(shù)式接口。接下來我們繼續(xù)討論與之相關(guān)的特性 --- 默認(rèn)方法。...
- 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...