java8新特性:interface中的static方法和default方法


java8中接口有兩個新特性,一個是靜態方法,一個是默認方法。

static方法

java8中為接口新增了一項功能:定義一個或者多個靜態方法。

定義用法和普通的static方法一樣:

public interface InterfaceTest {
    /**
     * 接口中的靜態方法
     */
    static void testStatic() {
        System.out.println("我是接口的一個靜態方法");
    }
}

調用的方式和靜態類調用靜態方法一樣:

InterfaceTest.testStatic(); // 我是接口的一個靜態方法

這里要注意的是,實現接口的類或者子接口不會繼承接口中的靜態方法。

default方法

在接口中,增加default方法,是為了既有的成千上萬的Java類庫的類增加新的功能,且不必對這些類進行重新設計。因此它既被稱為默認方法,又被稱為拓展方法。

比如說,只需要在Collection接口中增加default Stream stream(),相應的Set和List接口以及它們的子類都會包含此方法,不必再去為每個子類重新copy這個方法。

default方法的出現,允許了我們在接口中添加非抽象的方法實現。

實現單一接口,僅實現接口:

public interface InterfaceTest {
    /**
     * 接口下的靜態方法
     */
    static void testStatic() {
        System.out.println("我是接口下的靜態方法");
    }

    /**
     * 接口下的默認方法
     */
    default void testDefault() {
        System.out.println("我是接口下的默認方法");
    }

}

/**
 * 只實現這個接口
 */
public class InterfaceTestImpl implements InterfaceTest {

}

僅實現接口的運行:

InterfaceTest.testStatic(); // 我是接口下的靜態方法
new InterfaceTestImpl().testDefault(); // 我是接口下的默認方法

如果接口中的默認方法不能滿足某個實現類的需要,那么實現類可以覆蓋默認方法。

實現單一接口,並重寫接口中的default方法:

public class InterfaceTestImpl implements InterfaceTest {
    /**
     * 跟接口default方法一致,但不能再加default修飾符
     */
    @Override
    public void testDefault(){
        System.out.println("我重寫了接口的默認方法");
    }
}

重寫了default方法的運行:

InterfaceTest.testStatic(); // 我是接口下的靜態方法
new InterfaceTestImpl().testDefault(); // 我重寫了接口的默認方法

實現多個接口,且接口中擁有相同的default方法和static方法:

public class InterfaceATestImpl implements InterfaceTest, InterfaceTest1{
    @Override
    public void testDefault() {
        System.out.println("我重寫了兩個接口相同的默認方法");
    }
}

重寫了兩個接口相同的default方法的運行:

InterfaceTest.testStatic(); // 我是接口下的靜態方法
new InterfaceTestImpl().testDefault(); // 我重寫了兩個接口相同的默認方法

如果實現多個接口的時候,每個接口都有相同的default方法,則必須要重寫該方法。

 

"人的前半生沒有對錯,只有成長。"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM