1. 程式人生 > 程式設計 >Java8新特性之介面中的預設方法和靜態方法

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新特性之介面中的預設方法和靜態方法

以上就是Java8新特性之介面中的預設方法和靜態方法的詳細內容,更多關於JAVA8 新特性的資料請關注我們其它相關文章!