【Java8新特性】介面中的默認方法和靜態方法,你都掌握了嗎?
寫在前面
在Java8之前的版本中,介面中只能聲明常量和抽象方法,介面的實現類中必須實現介面中所有的抽象方法。而在Java8中,介面中可以聲明默認方法和靜態方法,本文,我們就一起探討下介面中的默認方法和靜態方法。
介面中的默認方法
Java 8中允許介面中包含具有具體實現的方法,該方法稱為「默認方法」,默認方法使用 default 關鍵字修飾 。
例如,我們可以定義一個介面MyFunction,其中,包含有一個默認方法getName,如下所示。
public interface MyFunction<T>{
T get(Long id);
default String getName(){
return "binghe";
}
}
默認方法的原則
在Java8中,默認方法具有「類優先」的原則。
若一個介面中定義了一個默認方法,而另外一個父類或介面中又定義了一個同名的方法時,遵循如下的原則。
1.選擇父類中的方法。如果一個父類提供了具體的實現,那麼介面中具有相同名稱和參數的默認方法會被忽略。
例如,現在有一個介面為MyFunction,和一個類MyClass,如下所示。
- MyFunction介面
public interface MyFunction{
default String getName(){
return "MyFunction";
}
}
- MyClass類
public class MyClass{
public String getName(){
return "MyClass";
}
}
此時,創建SubClass類繼承MyClass類,並實現MyFunction介面,如下所示。
public class SubClass extends MyClass implements MyFunction{
}
接下來,我們創建一個SubClassTest類,對SubClass類進行測試,如下所示。
public class SubClassTest{
@Test
public void testDefaultFunction(){
SubClass subClass = new SubClass();
System.out.println(subClass.getName());
}
}
運行上述程式,會輸出字元串:MyClass。
2.介面衝突。如果一個父介面提供一個默認方法,而另一個介面也提供了一個具有相同名稱和參數列表的方法(不管方法是否是默認方法), 那麼必須覆蓋該方法來解決衝突。
例如,現在有兩個介面,分別為MyFunction和MyInterface,各自都有一個默認方法getName(),如下所示。
- MyFunction介面
public interface MyFunction{
default String getName(){
return "function";
}
}
- MyInterface介面
public interface MyInterface{
default String getName(){
return "interface";
}
}
實現類MyClass同時實現了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。
介面中的靜態方法
在Java8中,介面中允許添加靜態方法,使用方式介面名.方法名。例如MyFunction介面中定義了靜態方法send()。
public interface MyFunction{
default String getName(){
return "binghe";
}
static void send(){
System.out.println("Send Message...");
}
}
我們可以直接使用如下方式調用MyFunction介面的send靜態方法。
MyFunction.send();
寫在最後
如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Java8新特性。
最後,附上Java8新特性核心知識圖,祝大家在學習Java8新特性時少走彎路。