Java 8中,你能夠爲接口添加靜態方法和默認方法。從技術角度來講,這是徹底合法的,只是它看起來違反了接口做爲一個抽象定義的理念。猜測設計初衷可能使爲了兼容8如下的jdk Java8出來了個函數式接口,只要聲明成函數式接口的接口都只能有一個抽象方法,爲了便於擴展,賦予接口這麼一個新特性
靜態方法:使用 static 關鍵字修飾。能夠經過接口直接調用靜態方法,並執行其方法體。咱們常常在相互一塊兒使用的類中使用靜態方法。你能夠在標準庫中找到像Collection/Collections或者Path/Paths這樣成對的接口和類。
默認方法:默認方法使用 default 關鍵字修飾。能夠經過實現類對象來調用。咱們在已有的接口中提供新方法的同時,還保持了與舊版本代碼的兼容性。
好比:java 8 API中對Collection、List、Comparator等接口提供了豐富的默認方法。java
若一個接口中定義了一個默認方法,而另一個父類或接口中又定義了一個同名的方法時
選擇父類中的方法。若是一個父類提供了具體的實現,那麼接口中具備相同名稱和參數的默認方法會被忽略。
看例子:ide
package com.xnn.newInterface; /** * 類(接口)描述: * @author xnn * 2018年10月25日下午3:56:46 */ public interface Myfun { //新增了默認方法 有方法體了 default String getName() { return "return "接口中的getName方法"; } //還能夠寫靜態方法 public static void show() { System.out.println("Java8接口中的靜態方法"); } } package com.xnn.newInterface; /** * 類(接口)描述: * @author xnn * 2018年10月25日下午3:59:20 */ public class Myclass { public String getName() { return "類中的getName()方法"; } } package com.xnn.newInterface; /** * 類(接口)描述:既繼承 又實現 遵循類優先原則 * @author xnn * 2018年10月25日下午4:00:29 */ public class MYsubClass extends Myclass implements Myfun { } package com.xnn.newInterface; /** * 類(接口)描述: * @author xnn * 2018年10月25日下午4:01:41 */ public class TEst { public static void main(String[] args) { MYsubClass class1 = new MYsubClass(); //調類裏面的方法 System.out.println(class1.getName()); Myfun.show(); } }
結果函數
類中的getName()方法 Java8接口中的靜態方法
若是一個父接口提供一個默認方法,而另外一個接口也提供了一個具備相同名稱和參數列表的方法(無論方法是不是默認方法),那麼實現類必須覆蓋該方法來解決衝突
例子:設計
package com.xnn.newInterface; /** * 類(接口)描述: * @author xnn * 2018年10月25日下午3:56:46 */ public interface Myfun { //新增了默認方法 有方法體了 default String getName() { return "接口中的getName方法"; } //還能夠寫靜態方法 public static void show() { System.out.println("Java8接口中的靜態方法"); } } package com.xnn.newInterface; /** * 類(接口)描述: * @author xnn * 2018年10月25日下午4:03:45 */ public interface MyInterface { default String getName() { return "MYin接口" ; } } package com.xnn.newInterface; /** * 類(接口)描述: * @author xnn * 2018年10月25日下午3:59:20 */ public class Myclass { public String getName() { return "類中的getName()方法"; } } package com.xnn.newInterface; /** * 類(接口)描述:實現兩個接口時 必須指定一個來解決衝突 * @author xnn * 2018年10月25日下午4:00:29 */ public class MYsubClass implements Myfun,MyInterface { @Override public String getName() { // TODO Auto-generated method stub return Myfun.super.getName(); } }