Java 8 | 接口的默認方法和靜態方法
Java 8
使用兩個新概念擴展了接口的含義:默認方法和靜態方法。默認方法使得接口有點類似traits
,不過要實現的目標不一樣。默認方法使得開發者可以在 不破壞二進制兼容性的前提下,往現存接口中添加新的方法,即不強制那些實現了該接口的類也同時實現這個新加的方法。
為什麼要有這個特性?
首先,之前的接口是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改接口時候,需要修改全部實現該接口的類,目前的java 8
之前的集合框架沒有foreach
方法,通常能想到的解決辦法是在JDK
裡給相關的接口添加新的方法及實現。然而,對於已經發布的版本,是沒法在給接口添加新方法的同時不影響已有的實現。所以引進的默認方法。他們的目的是為了解決接口的修改與現有的實現不兼容的問題。
默認方法和抽象方法之間的區別在於抽象方法需要實現,而默認方法不需要。接口提供的默認方法會被接口的實現類繼承或者覆寫,例子程式碼如下:
1 | private interface Defaulable { |
Defaulable
接口使用關鍵字default
定義了一個默認方法notRequired()
。DefaultableImpl
類實現了這個接口,同時默認繼承了這個接口中的默認方法;OverridableImpl
類也實現了這個接口,但覆寫了該接口的默認方法,並提供了一個不同的實現。
Java 8
帶來的另一個有趣的特性是在接口中可以定義靜態方法,例子程式碼如下:
1 | private interface DefaulableFactory { |
下面的程式碼片段整合了默認方法和靜態方法的使用場景:
1 | public static void main( String[] args ) { |
輸出的結果為:
1 | Default implementation |
由於JVM
上的默認方法的實現在字節碼層面提供了支持,因此效率非常高。默認方法允許在不打破現有繼承體系的基礎上改進接口。該特性在官方庫中的應用是:給java.util.Collection
接口添加新方法,如stream()
、parallelStream()
、forEach()
和removeIf()
等等。
儘管默認方法有這麼多好處,但在實際開發中應該謹慎使用:在復雜的繼承體系中,默認方法可能引起歧義和編譯錯誤。如果你想了解更多細節,可以參考官方文件。
默認方法實例
1 | public class Java8Tester { |
輸出的結果為:
1 | 我是一輛車! |
註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南