Java 8 默認方法

Java 8 新特性 Java 8 新特性


Java 8 新增了介面的默認方法。

簡單說,默認方法就是介面可以有實現方法,而且不需要實現類去實現其方法。

我們只需在方法名前面加個 default 關鍵字即可實現默認方法。

為什麼要有這個特性?

首先,之前的介面是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改介面時候,需要修改全部實現該介面的類,目前的 java 8 之前的集合框架沒有 foreach 方法,通常能想到的解決辦法是在JDK裏給相關的介面添加新的方法及實現。然而,對於已經發佈的版本,是沒法在給介面添加新方法的同時不影響已有的實現。所以引進的默認方法。他們的目的是為了解決介面的修改與現有的實現不相容的問題。

語法

默認方法語法格式如下:

public interface Vehicle { default void print(){ System.out.println("我是一輛車!"); } }

多個默認方法

一個介面有默認方法,考慮這樣的情況,一個類實現了多個介面,且這些介面有相同的默認方法,以下實例說明了這種情況的解決方法:

public interface Vehicle { default void print(){ System.out.println("我是一輛車!"); } } public interface FourWheeler { default void print(){ System.out.println("我是一輛四輪車!"); } }

第一個解決方案是創建自己的默認方法,來覆蓋重寫介面的默認方法:

public class Car implements Vehicle, FourWheeler { default void print(){ System.out.println("我是一輛四輪汽車!"); } }

第二種解決方案可以使用 super 來調用指定介面的默認方法:

public class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); } }

靜態默認方法

Java 8 的另一個特性是介面可以聲明(並且可以提供實現)靜態方法。例如:

public interface Vehicle { default void print(){ System.out.println("我是一輛車!"); } // 靜態方法 static void blowHorn(){ System.out.println("按喇叭!!!"); } }

默認方法實例

我們可以通過以下代碼來瞭解關於默認方法的使用,可以將代碼放入 Java8Tester.java 檔中:

Java8Tester.java 檔

public class Java8Tester { public static void main(String args[]){ Vehicle vehicle = new Car(); vehicle.print(); } } interface Vehicle { default void print(){ System.out.println("我是一輛車!"); } static void blowHorn(){ System.out.println("按喇叭!!!"); } } interface FourWheeler { default void print(){ System.out.println("我是一輛四輪車!"); } } class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("我是一輛汽車!"); } }

執行以上腳本,輸出結果為:

$ javac Java8Tester.java
$ java Java8Tester
我是一輛車!
我是一輛四輪車!
按喇叭!!!
我是一輛汽車!

Java 8 新特性 Java 8 新特性