在Java8以前的版本中,接口中只能聲明常量和抽象方法,接口的實現類中必須實現接口中全部的抽象方法。而在Java8中,接口中能夠聲明默認方法和靜態方法,本文,咱們就一塊兒探討下接口中的默認方法和靜態方法。java
Java 8中容許接口中包含具備具體實現的方法,該方法稱爲「默認方法」,默認方法使用 default 關鍵字修飾 。微信
例如,咱們能夠定義一個接口MyFunction,其中,包含有一個默認方法getName,以下所示。ide
public interface MyFunction<T>{ T get(Long id); default String getName(){ return "binghe"; } }
在Java8中,默認方法具備「類優先」的原則。學習
若一個接口中定義了一個默認方法,而另一個父類或接口中又定義了一個同名的方法時,遵循以下的原則。測試
1.選擇父類中的方法。若是一個父類提供了具體的實現,那麼接口中具備相同名稱和參數的默認方法會被忽略。code
例如,如今有一個接口爲MyFunction,和一個類MyClass,以下所示。blog
public interface MyFunction{ default String getName(){ return "MyFunction"; } }
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(),以下所示。
public interface MyFunction{ default String getName(){ return "function"; } }
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新特性時少走彎路。