在JDK7及之前的版本中,接口中都是抽象方法,不能定義方法體,可是從jdk8開始,接口中能夠定義靜態的非抽象的方法,直接使用接口名調用靜態方法,可是它的實現類的類名或者實例卻不能夠調用接口中的靜態方法。也能夠定義普通的非抽象的方法,普通的非抽象方法要在返回值前加上default,對於普通的非抽象方法必須使用子類的實例來調用。若是有多個接口定義了相同的默認方法,實現多個這些接口時必須重寫默認方法,不然編譯失敗。jdk8的接口中,開始容許使用關鍵字default。java
先定義一個簡單的接口:markdown
public interface JDK8Interface1 {
//接口中能夠定義靜態方法了
public static void staticMethod(){
System.out.println("接口中的靜態方法");
}
//使用default以後就能夠定義普通方法的方法體了
public default void defaultMethod(){
System.out.println("接口中的默認方法");
}
}
再定義一個接口的實現類:spa
public class JDK8InterfaceImpl implements JDK8Interface1 {
//實現接口後,由於默認方法不是抽象方法,因此能夠不重寫,可是若是開發須要,也能夠重寫
}
直接調用接口中的方法:code
@Test
public void test1(){
//能夠直接使用接口名.靜態方法來訪問接口中的靜態方法
JDK8Interface1.staticMethod();
//接口中的默認方法必須經過它的實現類來調用
new JDK8InterfaceImpl().defaultMethod();
}
輸出:接口
若是有兩個接口中的靜態方法如出一轍,而且一個實現類同時實現了這兩個接口,此時並不會產生錯誤,由於jdk8不容許使用接口的實現類調用接口中的靜態方法。圖片
可是若是兩個接口中定義瞭如出一轍的默認方法,而且一個實現類同時實現了這兩個接口,那麼必須重寫默認方法,不然編譯失敗。開發
看例子,定義兩個相同的接口,接口中的方法名徹底相同。string
JDK8Interface1.javait
public interface JDK8Interface1 {
//接口中能夠定義靜態方法了
public static void staticMethod(){
System.out.println("接口中的靜態方法");
}
//使用default以後就能夠定義普通方法的方法體了
public default void defaultMethod(){
System.out.println("接口中的默認方法");
}
}
JDK8Interface2.javaio
public interface JDK8Interface2 {
//接口中能夠定義靜態方法了
public static void staticMethod(){
System.out.println("接口中的靜態方法");
}
//使用default以後就能夠定義普通方法的方法體了
public default void defaultMethod(){
System.out.println("接口中的默認方法");
}
}
若是有一個類同時實現了這兩個方法,那麼它必須重寫接口中的defaultMethod()方法,不然編譯不經過。
JDK8InterfaceImpl2.java
public class JDK8InterfaceImpl2 implements JDK8Interface1,JDK8Interface2{
public void defaultMethod(){
System.out.println("實現類的默認方法");
}
}
@Test
public void test2(){
new JDK8InterfaceImpl2().defaultMethod();
}
輸出: