驚呆了!JDK1.8 居然打破了我對接口的一切認知。。。

前言


今天在學習mysql分區優化時,發現一個博客專家大神,對其發佈的文章簡單學習一下;java


一:簡介


咱們一般所說的接口的做用是用於定義一套標準、約束、規範等,接口中的方法只聲明方法的簽名,不提供相應的方法體,方法體由對應的實現類去實現。mysql


在JDK1.8中打破了這樣的認識,接口中的方法能夠有方法體,但須要關鍵字static或者default來修飾,使用static來修飾的稱之爲靜態方法,靜態方法經過接口名來調用,使用default來修飾的稱之爲默認方法,默認方法經過實例對象來調用。web


靜態方法和默認方法的做用:


靜態方法和默認方法都有本身的方法體,用於提供一套默認的實現,這樣子類對於該方法就不須要強制來實現,能夠選擇使用默認的實現,也能夠重寫本身的實現。sql


當爲接口擴展方法時,只須要提供該方法的默認實現便可,至於對應的實現類能夠重寫也能夠使用默認的實現,這樣全部的實現類不會報語法錯誤:Xxx不是抽象的, 而且未覆蓋Yxx中的抽象方法。微信


二:示例


IHello接口app


public interface IHello {

// 使用abstract修飾不修飾都行
void sayHi();

static void sayHello(){
        System.out.println("static method: say hello");
}

default void sayByebye(){
    System.out.println("default mehtod: say byebye");
}
}


HelloImpl實現類編輯器


public class HelloImpl implements IHello {
    
    @Override
    public void sayHi() {
        System.out.println("normal method: say hi");
    }

}


Mainide


public class Main {
    public static void main(String[] args) {
        HelloImpl helloImpl = new HelloImpl();
        // 對於abstract抽象方法經過實例對象來調用
        helloImpl.sayHi();
        // default方法只能經過實例對象來調用
        helloImpl.sayByebye();

        // 靜態方法經過 接口名.方法名() 來調用
        IHello.sayHello();

        // 接口是不容許new的,若是使用new後面必須跟上一對花括號用於實現抽象方法, 這種方式被稱爲匿名實現類,匿名實現類是一種沒有名稱的實現類
        // 匿名實現類的好處:不用再單獨聲明一個類,缺點:因爲沒有名字,不能重複使用,只能使用一次
        new IHello() {
                @Override
                public void sayHi() {
                    System.out.println("normal method: say hi");
                }
            }.sayHi();
    }
}


執行結果:


normal method: say hi
default mehtod: say byebye
static method: say hello
normal method: say hi


本文分享自微信公衆號 - Java學習提高(javaxuexitisheng)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。學習

相關文章
相關標籤/搜索