1. 程式人生 > >Java 8——接口中個的默認方法和靜態方法

Java 8——接口中個的默認方法和靜態方法

string 深入 col 函數 cti code 引用 lan mov

在Java SE 8之前,interface只是事物的抽象,用來定義統一的抽象事物和描述事物的抽象行為和屬性。

但是在Java SE 8中,增加了可以在interface中增加默認實現的行為和事物的靜態行為。

一.為什麽?

java叠代了如此多的版本且主要采用的都是演化的思想而非重構(為了保證與歷史的兼容性)。
這樣就容易出現很多比較難以處理的問題,接口在發布之後就已經被定型,除非我們能夠一次性更新所有該接口的實現。比如某個歷史接口有很多實現,需要在歷史接口中增加一個行為,那麽久需要在它的所有實現中去實現了該行為,那麽無疑是阻礙了演化,向接口中增加默認方法能使得接口仍能逐步發生演化,這也符合自然事物一直在發展的定律。

而且子啊Java SE 8中引入了函數式接口,使用接口中的默認方法和靜態方法 便能夠突破函數式接口的單個方法限制。

二.示例

接口中的默認方法

public interface TestDefaultMethodApi {

    default void print(String msg) {
        System.out.println(msg);
    }
}

接口中的靜態方法

public interface TestStaticMethodApi {

    static void utilMethod(String msg) {
        System.out.println(msg);
    }
}

三.用途

默認方法:

  1. 可以在函數式接口中使用
  2. 可以將公共的行為抽象為默認方法,所有實現中都會有該默認方法——這個可以參考Collection
  3. 可以在已經發布的接口中添加默認方法,讓接口具有新的行為,能夠繼續演化發展

靜態方法:

  1. 靜態更多屬性接口或者類型的本身行為,所已經可將一些近與接口耦合的工具方法作為靜態方法,實現高內聚

四.使用的註意點

  • 接口中定義了默認方法,那麽其實現中都會有該默認方法,但是默認方法是不需要去實現的,如果實現中沒有覆蓋接口中定義的默認方法,那麽實現中調用默認方法表現出的行為能力即接口中實現的默認方法

  • 具體的實現中可以覆蓋默認行為的實現,如:Vector向量覆蓋了Collection中的removeIf

  • 默認方法只能定義在接口中,如果被定義在其他地方,則編譯錯誤

參考

深入理解Java 8 Lambda(語言篇——lambda,方法引用,目標類型和默認方法)

Java 8——接口中個的默認方法和靜態方法