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

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

簡介

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

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

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

靜態方法和默認方法都有自己的方法體,用於提供一套默認的實現,這樣子類對於該方法就不需要強制來實現,可以選擇使用默認的實現,也可以重寫自己的實現。當爲接口擴展方法時,只需要提供該方法的默認實現即可,至於對應的實現類可以重寫也可以使用默認的實現,這樣所有的實現類不會報語法錯誤:Xxx不是抽象的, 並且未覆蓋Yxx中的抽象方法。

示例

IHello接口

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");
}
}

Main

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

這篇文章雖然簡單,但是我覺得還是有必要分享一下,畢竟與1.7相比,發生了不少的變化,希望本文能對你有所幫助。

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/zhibo

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-08-02
本文作者: 泡代碼的小二黑
本文來自:“互聯網架構師”,瞭解相關信息可以關注“互聯網架構師

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章