Java 8 之默認方法(Default Methods)

Oracle官網是這樣介紹默認方法的,使用默認方法,可以達到往接口裏面增加新的功能,而且保持與老版本代碼兼容,也就是原來的實現類可以不需要被動修改。所以,默認方法位置是在接口裏面;默認方法具有實現,不會強制具體類來現。Java 8要充分利用Lambda,需要增強大量的類庫,但是又希望做到兼容性,只能用默認方法這個大招。

默認方法

默認方法與普通的接口方法相比,最前面增加default關鍵字,參數列表之後接大括號,實現該方法,再後面沒有分號。

默認方法的例子

public interface Player {
    String getName();

    default boolean isMale() {
        return true;
    }
}

擴展包含默認方法的接口

當一個接口擴展另外一個包含默認方法的接口的時候,有以下3種處理方式。

  • 完全無視默認方法
    直接繼承了上級接口的默認方法
  • 重新申明默認方法
    重新把默認方法申明爲抽象方法(無實現,具體子類必需再次實現該方法)
  • 重新實現默認方法
    重寫了默認方法的實現,依然是一個默認方法。

抽象類實現包含默認方法的接口和上述描述一樣。具體類實現包含默認方法的接口的,沒有第二條。

接口靜態方法

Java 8 接口也可以有靜態方法了。靜態方法,從職責定位來講,就是個工具方法。

public interface Player {
    String getName();

    public static void printContact(Contact contact) {
        // TODO print contact for play in the following
    }
}

接口與抽象類

記得在什麼地方看到過,Java之父說,再給他一次設計Java的機會,Java裏就不會有抽象類。面試的時候也有很多時候問接口與抽象類的區別。

總的來說抽象類和接口越來越接近了,是接口向抽象類靠近,剝奪抽象類的生存空間。
默認方法和接口靜態方法都是重型武器。

  • 與抽象類相比,接口不能搞定的

    • 抽象類能夠定義非 static final 的屬性(field)
      ,而接口不能。接口的屬性都是static final的。
    • 抽象類能夠定義非public方法,而接口不能。接口的方法都是public的。
  • 與接口相比,抽象類不能搞定的

    • 接口可以多繼承(實現),而抽象類不能。抽象類只能單繼承。

結語

雖然默認方法在JDK裏面主要用於擴展已有類庫,不過新的項目默認方法依然很有價值。
曾今的寫接口,寫抽象類,寫具體類這個流程,某些時候可以省去中間的這個步驟。而且接口裏面也可以存放一些工具方法了(接口靜態方法)。不過,記得接口的方法都是public的,如果想要嚴格控制訪問,那麼還得使用抽象類。

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