Java 8 默認(rèn)方法

Java 8 新特性 Java 8 新特性


Java 8 新增了接口的默認(rèn)方法。

簡(jiǎn)單說(shuō),默認(rèn)方法就是接口可以有實(shí)現(xiàn)方法,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法。

我們只需在方法名前面加個(gè)default關(guān)鍵字即可實(shí)現(xiàn)默認(rèn)方法。

為什么要有這個(gè)特性?

首先,之前的接口是個(gè)雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當(dāng)需要修改接口時(shí)候,需要修改全部實(shí)現(xiàn)該接口的類,目前的java 8之前的集合框架沒有foreach方法,通常能想到的解決辦法是在JDK里給相關(guān)的接口添加新的方法及實(shí)現(xiàn)。然而,對(duì)于已經(jīng)發(fā)布的版本,是沒法在給接口添加新方法的同時(shí)不影響已有的實(shí)現(xiàn)。所以引進(jìn)的默認(rèn)方法。他們的目的是為了解決接口的修改與現(xiàn)有的實(shí)現(xiàn)不兼容的問題。

語(yǔ)法

默認(rèn)方法語(yǔ)法格式如下:

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

多個(gè)默認(rèn)方法

一個(gè)接口有默認(rèn)方法,考慮這樣的情況,一個(gè)類實(shí)現(xiàn)了多個(gè)接口,且這些接口有相同的默認(rèn)方法,以下實(shí)例說(shuō)明了這種情況的解決方法:

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

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

第一個(gè)解決方案是創(chuàng)建自己的默認(rèn)方法,來(lái)覆蓋重寫接口的默認(rèn)方法:

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

第二種解決方案可以使用 super 來(lái)調(diào)用指定接口的默認(rèn)方法:

public class car implements vehicle, fourWheeler {
   default void print(){
      vehicle.super.print();
   }
}

靜態(tài)默認(rèn)方法

Java 8 的另一個(gè)特性是接口可以聲明(并且可以提供實(shí)現(xiàn))靜態(tài)方法。例如:

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

默認(rèn)方法實(shí)例

我們可以通過以下代碼來(lái)了解關(guān)于默認(rèn)方法的使用,可以將代碼放入 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("我是一輛汽車!");
   }
}

執(zhí)行以上腳本,輸出結(jié)果為:

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

Java 8 新特性 Java 8 新特性