JDK8新特性之接口

在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();
    }

輸出:

這裏寫圖片描述

相關文章
相關標籤/搜索