標籤:介面 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); }}
三.用途
預設方法:
- 可以在函數式介面中使用
- 可以將公用的行為抽象為預設方法,所有實現中都會有該預設方法——這個可以參考Collection
- 可以在已經發布的介面中添加預設方法,讓介面具有新的行為,能夠繼續演化發展
靜態方法:
- 靜態更多屬性介面或者類型的本身行為,所已經可將一些近與介面耦合的工具方法作為靜態方法,實現高內聚
四.使用的注意點
介面中定義了預設方法,那麼其實現中都會有該預設方法,但是預設方法是不需要去實現的,如果實現中沒有覆蓋介面中定義的預設方法,那麼實現中調用預設方法表現出的行為能力即介面中實現的預設方法
具體的實現中可以覆蓋預設行為的實現,如:Vector向量覆蓋了Collection中的removeIf
預設方法只能定義在介面中,如果被定義在其他地方,則編譯錯誤
參考
深入理解Java 8 Lambda(語言篇——lambda,方法引用,目標類型和預設方法)
Java 8——介面中個的預設方法和靜態方法