Java8新特性之接口中的默認(rèn)方法和靜態(tài)方法
寫在前面
在Java8之前的版本中,接口中只能聲明常量和抽象方法,接口的實現(xiàn)類中必須實現(xiàn)接口中所有的抽象方法。而在Java8中,接口中可以聲明默認(rèn)方法和靜態(tài)方法,本文,我們就一起探討下接口中的默認(rèn)方法和靜態(tài)方法。
接口中的默認(rèn)方法
Java 8中允許接口中包含具有具體實現(xiàn)的方法,該方法稱為“默認(rèn)方法”,默認(rèn)方法使用 default 關(guān)鍵字修飾 。
例如,我們可以定義一個接口MyFunction,其中,包含有一個默認(rèn)方法getName,如下所示。
public interface MyFunction<T>{
T get(Long id);
default String getName(){
return "binghe";
}
}
默認(rèn)方法的原則
在Java8中,默認(rèn)方法具有“類優(yōu)先”的原則。
若一個接口中定義了一個默認(rèn)方法,而另外一個父類或接口中又定義了一個同名的方法時,遵循如下的原則。
1.選擇父類中的方法。如果一個父類提供了具體的實現(xiàn),那么接口中具有相同名稱和參數(shù)的默認(rèn)方法會被忽略。
例如,現(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.接口沖突。如果一個父接口提供一個默認(rèn)方法,而另一個接口也提供了一個具有相同名稱和參數(shù)列表的方法(不管方法是否是默認(rèn)方法), 那么必須覆蓋該方法來解決沖突。
例如,現(xiàn)在有兩個接口,分別為MyFunction和MyInterface,各自都有一個默認(rèn)方法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()默認(rèn)方法,所以,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新特性核心知識圖,祝大家在學(xué)習(xí)Java8新特性時少走彎路。

以上就是Java8新特性之接口中的默認(rèn)方法和靜態(tài)方法的詳細(xì)內(nèi)容,更多關(guān)于JAVA8 新特性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java自定義注解實現(xiàn)數(shù)據(jù)脫敏
在實際開發(fā)中經(jīng)常會遇到有一些信息不能全部展示用戶,需要隱藏(可以叫脫敏),所以本文為大家分享了利用自定義注解實現(xiàn)數(shù)據(jù)脫敏的示例代碼,需要的可以參考下2023-07-07
java設(shè)計模式原型模式與享元模式調(diào)優(yōu)系統(tǒng)性能詳解
這篇文章主要為大家介紹了java設(shè)計模式原型模式與享元模式調(diào)優(yōu)系統(tǒng)性能方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
SpringBoot優(yōu)雅的進行全局異常處理的實現(xiàn)步驟
在軟件開發(fā)的世界里,異常處理是保證系統(tǒng)穩(wěn)定性和用戶體驗的關(guān)鍵因素之一,尤其是在構(gòu)建基于微服務(wù)架構(gòu)的應(yīng)用時,SpringBoot提供了一套強大的工具來幫助開發(fā)者管理這些異常,所以本文給大家介紹了SpringBoot如何優(yōu)雅的進行全局異常處理,需要的朋友可以參考下2025-02-02
Java中的HashMap和Hashtable區(qū)別解析
這篇文章主要介紹了Java中的HashMap和Hashtable區(qū)別解析,HashMap和Hashtable都實現(xiàn)了Map接口,但決定用哪一個之前先要弄清楚它們之間的區(qū)別,主要的區(qū)別有線程安全性、同步和速度,需要的朋友可以參考下2023-11-11

