Java 8——介面中個的預設方法和靜態方法

來源:互聯網
上載者:User

標籤:介面   default   void   預設   res   log   比較   而且   編譯   

在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——介面中個的預設方法和靜態方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.