JDK8新特性:接口的靜態(tài)方法和默認(rèn)方法

在jdk8之前,interface之中可以定義變量和方法,變量必須是public、static、final的,方法必須是public、abstract的。由于這些修飾符都是默認(rèn)的,所以在JDK8之前,下面的寫法都是等價(jià)的。

public interface JDK8BeforeInterface {
    public static final int field1 = 0;
 
    int field2 = 0;
 
    public abstract void method1(int a) throws Exception;
 
    void method2(int a) throws Exception;
}

JDK8及以后,允許我們在接口中定義static方法和default方法。

public interface JDK8Interface {
 
    // static修飾符定義靜態(tài)方法
    static void staticMethod() {
        System.out.println("接口中的靜態(tài)方法");
    }
 
    // default修飾符定義默認(rèn)方法
    default void defaultMethod() {
        System.out.println("接口中的默認(rèn)方法");
    }
}
————————————————

再定義一個(gè)接口的實(shí)現(xiàn)類:

public class JDK8InterfaceImpl implements JDK8Interface {
    //實(shí)現(xiàn)接口后,因?yàn)槟J(rèn)方法不是抽象方法,所以可以不重寫,但是如果開發(fā)需要,也可以重寫
}

靜態(tài)方法,只能通過接口名調(diào)用,不可以通過實(shí)現(xiàn)類的類名或者實(shí)現(xiàn)類的對象調(diào)用。default方法,只能通過接口實(shí)現(xiàn)類的對象來調(diào)用。

public class Main {
    public static void main(String[] args) {
        // static方法必須通過接口類調(diào)用
        JDK8Interface.staticMethod();
 
        //default方法必須通過實(shí)現(xiàn)類的對象調(diào)用
        new JDK8InterfaceImpl().defaultMethod();
    }
}

當(dāng)然如果接口中的默認(rèn)方法不能滿足某個(gè)實(shí)現(xiàn)類需要,那么實(shí)現(xiàn)類可以覆蓋默認(rèn)方法。

public class AnotherJDK8InterfaceImpl implements JDK8Interface {
    
    // 簽名跟接口default方法一致,但是不能再加default修飾符
    @Override
    public void defaultMethod() {
        System.out.println("接口實(shí)現(xiàn)類覆蓋了接口中的default");
    }
}

由于java支持一個(gè)實(shí)現(xiàn)類可以實(shí)現(xiàn)多個(gè)接口,如果多個(gè)接口中存在同樣的static和default方法會(huì)怎么樣呢?如果有兩個(gè)接口中的靜態(tài)方法一模一樣,并且一個(gè)實(shí)現(xiàn)類同時(shí)實(shí)現(xiàn)了這兩個(gè)接口,此時(shí)并不會(huì)產(chǎn)生錯(cuò)誤,因?yàn)閖dk8只能通過接口類調(diào)用接口中的靜態(tài)方法,所以對編譯器來說是可以區(qū)分的。但是如果兩個(gè)接口中定義了一模一樣的默認(rèn)方法,并且一個(gè)實(shí)現(xiàn)類同時(shí)實(shí)現(xiàn)了這兩個(gè)接口,那么必須在實(shí)現(xiàn)類中重寫默認(rèn)方法,否則編譯失敗。

public interface JDK8Interface1 {
 
    // static修飾符定義靜態(tài)方法
    static void staticMethod() {
        System.out.println("JDK8Interface1接口中的靜態(tài)方法");
    }
 
    // default修飾符定義默認(rèn)方法
    default void defaultMethod() {
        System.out.println("JDK8Interface1接口中的默認(rèn)方法");
    }
 
}
public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {
 
    // 由于JDK8Interface和JDK8Interface1中default方法一樣,所以這里必須覆蓋
    @Override
    public void defaultMethod() {
        System.out.println("接口實(shí)現(xiàn)類覆蓋了接口中的default");
    }
}
public class Main {
    public static void main(String[] args) {
        JDK8Interface.staticMethod();
        JDK8Interface1.staticMethod();
        new JDK8InterfaceImpl().defaultMethod();
    }
}
圖片.png

原文地址:https://blog.csdn.net/aitangyong/article/details/54134385

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容