天天看點

JDK8中接口的新特性

JDK8中接口的新特性

在JDK8環境中,接口中的方法不再是隻能有抽象方法,他可以有靜态方法和default方法。

package com.wangcc.MyJavaSE.jdk8interface;

public interface NewInterface {
    static void staticMethod() {
        System.out.println("staticMethod");
    }

    default void defaultMethod() {
        System.out.println("defaultMethod");
    }

    public void getInfo();
}
給出一個接口,在JDK8的環境下,他可以擁有靜态方法和default方法,所謂default方法既是使用default關鍵字來修飾的方法。一個接口可以有多個靜态方法和default方法,沒有個數限制。

           

package com.wangcc.MyJavaSE.jdk8interface;

public class SimpleImpl implements NewInterface {

@Override
public void getInfo() {
    // TODO Auto-generated method stub
    System.out.println("INFO");
    defaultMethod();

}
           

實作類隻需要實作它的抽象方法即可,JDK8中的接口愈發的像抽象類靠攏的感覺。

package com.wangcc.MyJavaSE.jdk8interface;

import org.junit.Test;

public class NewInterfaceTest {
    @Test
    public void test() {
        NewInterface.staticMethod();
        new SimpleImpl().defaultMethod();
    }
}

           

關于靜态方法和default方法的調用。

對于靜态方法,并沒有特殊的地方,在接口中直接由接口名調用,不需要由接口實作類對象來調用。

而對于default方法,很明顯是需要實力對象來調用的。而且有一點需要特别注意。

我們知道在Java中是單繼承的,但是是可以實作多個接口的,是以,當一個類實作了多個接口之後,如果多個接口有着相同的default方法,即方法名和參數清單相同。那麼此時就會出現問題,無法識别到底是調用的哪個接口的方法,這個時候就必須要在實作類裡面顯式重寫default的方法,而關于default的方法的重寫,我們在實作類中不需要繼續出現default關鍵字也不能出現default關鍵字。

package com.wangcc.MyJavaSE.jdk8interface;

public class SimpleImpl implements NewInterface {

    @Override
    public void getInfo() {
        // TODO Auto-generated method stub
        System.out.println("INFO");
        defaultMethod();
    }

    public void defaultMethod() {
        System.out.println("Impl default Method");
    }
}

           

重寫的default方法必須的通路權限必須是public,因為default方法除了沒有顯式的通路修飾符外,隻能用public通路限定符來修飾,而我們知道在Java中,要重寫一個方法,通路限定符一定要大于父類或者接口指定的通路限定符範圍,而且方法聲明處抛出的異常也要大于後者。是以通路權限必須是public。

繼續閱讀