天天看點

【Java8新特性】接口中的預設方法和靜态方法,你都掌握了嗎?

【Java8新特性】接口中的預設方法和靜态方法,你都掌握了嗎?

寫在前面

在Java8之前的版本中,接口中隻能聲明常量和抽象方法,接口的實作類中必須實作接口中所有的抽象方法。而在Java8中,接口中可以聲明預設方法和靜态方法,本文,我們就一起探讨下接口中的預設方法和靜态方法。

接口中的預設方法

Java 8中允許接口中包含具有具體實作的方法,該方法稱為“預設方法”,預設方法使用 default 關鍵字修飾 。

例如,我們可以定義一個接口MyFunction,其中,包含有一個預設方法getName,如下所示。

public interface MyFunction{

T get(Long id);
default String getName(){
    return "binghe";
}           

}

預設方法的原則

在Java8中,預設方法具有“類優先”的原則。

若一個接口中定義了一個預設方法,而另外一個父類或接口中又定義了一個同名的方法時,遵循如下的原則。

1.選擇父類中的方法。如果一個父類提供了具體的實作,那麼接口中具有相同名稱和參數的預設方法會被忽略。

例如,現在有一個接口為MyFunction,和一個類MyClass,如下所示。

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(),如下所示。

default String getName(){
    return "function";
}           

MyInterface接口

public interface MyInterface{

default String getName(){
    return "interface";
}           

實作類MyClass同時實作了MyFunction接口和MyInterface接口,由于MyFunction接口和MyInterface接口中都存在getName()預設方法,是以,MyClass必須覆寫getName()方法來解決沖突,如下所示。

@Override
public String getName(){
    return MyInterface.super.getName();
}           

此時,MyClass類中的getName方法傳回的是:interface。

如果MyClass中的getName()方法覆寫的是MyFunction接口的getName()方法,如下所示。

@Override
public String getName(){
    return MyFunction.super.getName();
}           

此時,MyClass類中的getName方法傳回的是:function。

接口中的靜态方法

在Java8中,接口中允許添加靜态方法,使用方式接口名.方法名。例如MyFunction接口中定義了靜态方法send()。

default String getName(){
    return "binghe";
}
static void send(){
    System.out.println("Send Message...");
}           

我們可以直接使用如下方式調用MyFunction接口的send靜态方法。

MyFunction.send();

寫在最後

如果覺得文章對你有點幫助,請微信搜尋并關注「 冰河技術 」微信公衆号,跟冰河學習Java8新特性。

最後,附上Java8新特性核心知識圖,祝大家在學習Java8新特性時少走彎路。

原文位址

https://www.cnblogs.com/binghe001/p/13022207.html