接口default關鍵字

time: 2019年10月11日20:07:29
Type:java筆記

簡介

問題由來

default是在java8中引入的關鍵字,也可稱爲Virtual extension methods——虛擬擴展方法。
目的:是指,在接口內部包含了一些默認的方法實現(也就是接口中可以包含方法體,這打破了Java之前版本對接口的語法限制),從而使得接口在進行擴展的時候,不會破壞與接口相關的實現類代碼。

public interface SimpleInterface {
  public void doSomeWork();
 
  //A default method in the interface created using "default" keyword
  //使用default關鍵字創在interface中直接創建一個default方法,該方法包含了具體的實現代碼
  default public void doSomeOtherWork(){
    System.out.println("DoSomeOtherWork implementation in the interface");
  }
}

問題的背景(why)

爲什麼要有這個特性?
首先,之前的接口是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改接口時候,需要修改全部實現該接口的類,目前的java8之前的集合框架沒有foreach方法,通常能想到的解決辦法是在JDK裏給相關的接口添加新的方法及實現。然而,對於已經發布的版本,是沒法在給接口添加新方法的同時不影響已有的實現。所以引進的默認方法。他們的目的是爲了解決接口的修改與現有的實現不兼容的問題。1
說白了一句話:就是在不影響已有實現方式的形式,擴展接口。使用default 關鍵字指定。

實例

實例一

  1. 簡單的實現
public interface SimpleInterface {
  public void doSomeWork();
}
class SimpleInterfaceImpl implements SimpleInterface{
  @Override
  public void doSomeWork() {
    System.out.println("Do Some Work implementation in the class");
  }
   
  public static void main(String[] args) {
    SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
    simpObj.doSomeWork();
  }
}
  1. 後來的問題

問題場景:開發者想要修改已有的接口,擴展接口的功能,如何解決?

假如:添加了一個接口方法,修改了接口

public interface SimpleInterface {
  public void doSomeWork();
  public void doSomeOtherWork();
}

運行result
在這裏插入圖片描述
違背了接口的實現方式,實現接口的必須實現它的所有方法

總結

解決方式:default 關鍵字

public interface SimpleInterface {
  public void doSomeWork();
  //A default method in the interface created using "default" keyword
  //使用default關鍵字創在interface中直接創建一個default方法,該方法包含了具體的實現代碼
  default public void doSomeOtherWork(){
    System.out.println("DoSomeOtherWork implementation in the interface");
  }
}
 
class SimpleInterfaceImpl implements SimpleInterface{
  @Override
  public void doSomeWork() {
    System.out.println("Do Some Work implementation in the class");
  }
  /*
   * Not required to override to provide an implementation 
   * for doSomeOtherWork.
   * 在SimpleInterfaceImpl裏,不需要再去實現接口中定義的doSomeOtherWork方法
   */
 
  public static void main(String[] args) {
    SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
    simpObj.doSomeWork();
    simpObj.doSomeOtherWork();
  }
}

這樣就解決了接口的擴展問題。

實踐注意點:接口的default 是在擴展接口的功能的使用,在這一需求場景下。

  1. 作用:擴展類的接口
  2. 使用場景:後期修改擴展接口的功能。
  3. why要這種方式實現?

做到:修改代碼,不影響其他實體,這裏指的是:不需要修改接口實現類。就可以實現接口的功能擴展(在java個體之間互不影響的封裝的設計原則。)2

補充內容1:default 衝突

問題:使用默認方法,出現了衝突的解決方案是什麼?

宏觀上就是:遵循兩個原則

  1. 超類優先原則1
  2. 接口衝突覆蓋原則1

要你命三千又三千
權益問題 聯繫侵刪


  1. 簡單的擴展實例 https://blog.csdn.net/qq_35835624/article/details/80196932 ↩︎ ↩︎ ↩︎

  2. https://www.cnblogs.com/alchemists/articles/9678528.html ↩︎

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