寫(xiě)在前面
在Java8之前的版本中,接口中只能聲明常量和抽象方法,接口的實(shí)現(xiàn)類(lèi)中必須實(shí)現(xiàn)接口中所有的抽象方法。而在Java8中,接口中可以聲明默認(rèn)方法和靜態(tài)方法,本文,我們就一起探討下接口中的默認(rèn)方法和靜態(tài)方法。
接口中的默認(rèn)方法
Java 8中允許接口中包含具有具體實(shí)現(xiàn)的方法,該方法稱(chēng)為“默認(rèn)方法”,默認(rèn)方法使用 default 關(guān)鍵字修飾 。
例如,我們可以定義一個(gè)接口MyFunction,其中,包含有一個(gè)默認(rèn)方法getName,如下所示。
1
2
3
4
5
6
|
public interface MyFunction<T>{ T get(Long id); default String getName(){ return "binghe" ; } } |
默認(rèn)方法的原則
在Java8中,默認(rèn)方法具有“類(lèi)優(yōu)先”的原則。
若一個(gè)接口中定義了一個(gè)默認(rèn)方法,而另外一個(gè)父類(lèi)或接口中又定義了一個(gè)同名的方法時(shí),遵循如下的原則。
1.選擇父類(lèi)中的方法。如果一個(gè)父類(lèi)提供了具體的實(shí)現(xiàn),那么接口中具有相同名稱(chēng)和參數(shù)的默認(rèn)方法會(huì)被忽略。
例如,現(xiàn)在有一個(gè)接口為MyFunction,和一個(gè)類(lèi)MyClass,如下所示。
- MyFunction接口
1
2
3
4
5
|
public interface MyFunction{ default String getName(){ return "MyFunction" ; } } |
- MyClass類(lèi)
1
2
3
4
5
|
public class MyClass{ public String getName(){ return "MyClass" ; } } |
此時(shí),創(chuàng)建SubClass類(lèi)繼承MyClass類(lèi),并實(shí)現(xiàn)MyFunction接口,如下所示。
1
2
3
|
public class SubClass extends MyClass implements MyFunction{ } |
接下來(lái),我們創(chuàng)建一個(gè)SubClassTest類(lèi),對(duì)SubClass類(lèi)進(jìn)行測(cè)試,如下所示。
1
2
3
4
5
6
7
|
public class SubClassTest{ @Test public void testDefaultFunction(){ SubClass subClass = new SubClass(); System.out.println(subClass.getName()); } } |
運(yùn)行上述程序,會(huì)輸出字符串:MyClass。
2.接口沖突。如果一個(gè)父接口提供一個(gè)默認(rèn)方法,而另一個(gè)接口也提供了一個(gè)具有相同名稱(chēng)和參數(shù)列表的方法(不管方法是否是默認(rèn)方法), 那么必須覆蓋該方法來(lái)解決沖突。
例如,現(xiàn)在有兩個(gè)接口,分別為MyFunction和MyInterface,各自都有一個(gè)默認(rèn)方法getName(),如下所示。
- MyFunction接口
1
2
3
4
5
|
public interface MyFunction{ default String getName(){ return "function" ; } } |
- MyInterface接口
1
2
3
4
5
|
public interface MyInterface{ default String getName(){ return "interface" ; } } |
實(shí)現(xiàn)類(lèi)MyClass同時(shí)實(shí)現(xiàn)了MyFunction接口和MyInterface接口,由于MyFunction接口和MyInterface接口中都存在getName()默認(rèn)方法,所以,MyClass必須覆蓋getName()方法來(lái)解決沖突,如下所示。
1
2
3
4
5
6
|
public class MyClass{ @Override public String getName(){ return MyInterface. super .getName(); } } |
此時(shí),MyClass類(lèi)中的getName方法返回的是:interface。
如果MyClass中的getName()方法覆蓋的是MyFunction接口的getName()方法,如下所示。
1
2
3
4
5
6
|
public class MyClass{ @Override public String getName(){ return MyFunction. super .getName(); } } |
此時(shí),MyClass類(lèi)中的getName方法返回的是:function。
接口中的靜態(tài)方法
在Java8中,接口中允許添加靜態(tài)方法,使用方式接口名.方法名。例如MyFunction接口中定義了靜態(tài)方法send()。
1
2
3
4
5
6
7
8
|
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新特性核心知識(shí)圖,祝大家在學(xué)習(xí)Java8新特性時(shí)少走彎路。
以上就是Java8新特性之接口中的默認(rèn)方法和靜態(tài)方法的詳細(xì)內(nèi)容,更多關(guān)于JAVA8 新特性的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://www.cnblogs.com/binghe001/p/13022207.html