JDK8新增接口的默認方法與靜態方法

JDK8以前,interface中能夠定義常量和抽象方法,訪問修飾符是public。java

public interface A {
    /** a1和a2寫法是等價的 */
    public static final int a1 = 0;

    int a2 = 0;

    /** methodA1和methodA2寫法是等價的 */
    public abstract void methodA1();

    void methodA2();
}

 

JDK8起,容許咱們在interface中使用static和default修飾方法(使用這兩種修飾符中其一就不能使用abstract修飾符),從而方法具備方法體。ide

public interface A {
    /** default訪問修飾符修飾的方法 */
    default void methodB1() {
        System.out.println("this is default method");
    }

    /** static修飾符修飾的方法 */
    public static void methodB2() {
        System.out.println("this is static method");
    }
}

default修飾的方法,經過接口的實現類的對象調用;static修飾的方法,直接經過接口名調用。this

public class Test implements A{
    public static void main(String[] args) {

        /** 接口的default方法,經過接口的實現類的對象調用 */
        Test test = new Test();
        test.methodB1();

        /** 接口的靜態方法,經過接口名調用 */
        A.methodB2();
    }
}

 

因爲java支持一個實現類能夠實現多個接口,若是多個接口中存在一樣的static和default方法會怎麼樣呢?spa

  • 若是有兩個接口中的static方法如出一轍,而且實現類同時實現了這兩個接口,此時並不會產生錯誤,由於jdk8只能經過接口類調用接口中的靜態方法,因此對編譯器來講是能夠區分的。
  • 若是兩個接口中定義瞭如出一轍的default方法,而且一個實現類同時實現了這兩個接口,那麼必須在實現類中重寫默認方法,不然編譯失敗。
public interface A {
    /** default訪問修飾符修飾的方法 */
    default void methodB1() {
        System.out.println("this is default method -- InterfaceA");
    }

    /** static修飾符修飾的方法 */
    public static void methodB2() {
        System.out.println("this is static method -- InterfaceA");
    }
}

public interface B{
    /** default訪問修飾符修飾的方法 */
    default void methodB1() {
        System.out.println("this is default method -- InterfaceB");
    }

    /** static修飾符修飾的方法 */
    public static void methodB2() {
        System.out.println("this is static method -- InterfaceB");
    }
}

public class Test implements A,B{
    /** 因爲A和B中default方法同樣,因此這裏必須覆蓋 */
    @Override
    public void methodB1() {
        System.out.println("this is Overriding methods");
    }
    
    public static void main(String[] args) {

        /** 接口的default方法,經過接口的實現類的對象調用 */
        Test test = new Test();
        test.methodB1();

        /** A接口的靜態方法,經過接口名調用 */
        A.methodB2();
        /** B接口的靜態方法,經過接口名調用 */
        B.methodB2();
    }
}

運行結果:.net

  

 

參考: https://blog.csdn.net/aitangyong/article/details/54134385code

相關文章
相關標籤/搜索