Java8新特性之接口中的默認方法和靜態(tài)方法
寫在前面
在Java8之前的版本中,接口中只能聲明常量和抽象方法,接口的實現(xiàn)類中必須實現(xiàn)接口中所有的抽象方法。而在Java8中,接口中可以聲明默認方法和靜態(tài)方法,本文,我們就一起探討下接口中的默認方法和靜態(tài)方法。
接口中的默認方法
Java 8中允許接口中包含具有具體實現(xiàn)的方法,該方法稱為“默認方法”,默認方法使用 default 關(guān)鍵字修飾 。
例如,我們可以定義一個接口MyFunction,其中,包含有一個默認方法getName,如下所示。
public interface MyFunction<T>{ T get(Long id); default String getName(){ return "binghe"; } }
默認方法的原則
在Java8中,默認方法具有“類優(yōu)先”的原則。
若一個接口中定義了一個默認方法,而另外一個父類或接口中又定義了一個同名的方法時,遵循如下的原則。
1.選擇父類中的方法。如果一個父類提供了具體的實現(xiàn),那么接口中具有相同名稱和參數(shù)的默認方法會被忽略。
例如,現(xiàn)在有一個接口為MyFunction,和一個類MyClass,如下所示。
- MyFunction接口
public interface MyFunction{ default String getName(){ return "MyFunction"; } }
- MyClass類
public class MyClass{ public String getName(){ return "MyClass"; } }
此時,創(chuàng)建SubClass類繼承MyClass類,并實現(xiàn)MyFunction接口,如下所示。
public class SubClass extends MyClass implements MyFunction{ }
接下來,我們創(chuàng)建一個SubClassTest類,對SubClass類進行測試,如下所示。
public class SubClassTest{ @Test public void testDefaultFunction(){ SubClass subClass = new SubClass(); System.out.println(subClass.getName()); } }
運行上述程序,會輸出字符串:MyClass。
2.接口沖突。如果一個父接口提供一個默認方法,而另一個接口也提供了一個具有相同名稱和參數(shù)列表的方法(不管方法是否是默認方法), 那么必須覆蓋該方法來解決沖突。
例如,現(xiàn)在有兩個接口,分別為MyFunction和MyInterface,各自都有一個默認方法getName(),如下所示。
- MyFunction接口
public interface MyFunction{ default String getName(){ return "function"; } }
- MyInterface接口
public interface MyInterface{ default String getName(){ return "interface"; } }
實現(xiàn)類MyClass同時實現(xiàn)了MyFunction接口和MyInterface接口,由于MyFunction接口和MyInterface接口中都存在getName()默認方法,所以,MyClass必須覆蓋getName()方法來解決沖突,如下所示。
public class MyClass{ @Override public String getName(){ return MyInterface.super.getName(); } }
此時,MyClass類中的getName方法返回的是:interface。
如果MyClass中的getName()方法覆蓋的是MyFunction接口的getName()方法,如下所示。
public class MyClass{ @Override public String getName(){ return MyFunction.super.getName(); } }
此時,MyClass類中的getName方法返回的是:function。
接口中的靜態(tài)方法
在Java8中,接口中允許添加靜態(tài)方法,使用方式接口名.方法名。例如MyFunction接口中定義了靜態(tài)方法send()。
public interface MyFunction{ default String getName(){ return "binghe"; } static void send(){ System.out.println("Send Message..."); } }
我們可以直接使用如下方式調(diào)用MyFunction接口的send靜態(tài)方法。
MyFunction.send();
最后,附上Java8新特性核心知識圖,祝大家在學習Java8新特性時少走彎路。
以上就是Java8新特性之接口中的默認方法和靜態(tài)方法的詳細內(nèi)容,更多關(guān)于JAVA8 新特性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Java進行FreeMarker的web模板開發(fā)的基礎(chǔ)教程
這篇文章主要介紹了使用Java進行FreeMarker模板引擎開發(fā)的基礎(chǔ)教程,文中針對FreeMarker的網(wǎng)頁標簽用法給出了一些例子,需要的朋友可以參考下2016-03-03Java 中橋接模式——對象結(jié)構(gòu)型模式的實例詳解
這篇文章主要介紹了Java 中橋接模式——對象結(jié)構(gòu)型模式的實例詳解的相關(guān)資料,希望通過本文大家能掌握這部分知識,需要的朋友可以參考下2017-09-09詳解SpringBoot中5種類型參數(shù)傳遞和json數(shù)據(jù)傳參的操作
當涉及到參數(shù)傳遞時,Spring?Boot遵循HTTP協(xié)議,并支持多種參數(shù)傳遞方式,這些參數(shù)傳遞方式可以根據(jù)請求的不同部分進行分類,2023-12-12springboot構(gòu)造樹形結(jié)構(gòu)數(shù)據(jù)并查詢的方法
本文主要介紹了springboot怎樣構(gòu)造樹形結(jié)構(gòu)數(shù)據(jù)并查詢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11Spring中的@ConditionalOnProperty注解使用詳解
這篇文章主要介紹了Spring中的@ConditionalOnProperty注解使用詳解,在 spring boot 中有時候需要控制配置類是否生效,可以使用 @ConditionalOnProperty 注解來控制 @Configuration 是否生效,需要的朋友可以參考下2024-01-01SpringBoot整合spring-data-jpa的方法
這篇文章主要介紹了SpringBoot整合spring-data-jpa的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06