Java8預設方法


Java8引入的介面預設方法實現一個新的概念。此功能是為了向後相容性增加,使舊介面可用於利用JAVA8。 lambda表示式的能力,例如,列表或集合介面不具備forEach方法宣告。從而增加了這樣的方法只會打破收集框架實現。 Java8引入了預設的方法使列表/Collection介面可以擁有forEach預設方法,並實行類實現這些介面不需要實現相同功能。

語法

public interface vehicle {
	default void print(){
		System.out.println("I am a vehicle!");
	}
}

多重預設

在介面預設方法,它們是一類實現兩個介面使用相同的預設方法,那麼如何解決這種模糊性。考慮下面的情況。

public interface vehicle {
	default void print(){
		System.out.println("I am a vehicle!");
	}
}
public interface fourWheeler {
	default void print(){
		System.out.println("I am a four wheeler!");
	}
}

第一個解決方案是建立一個自己的方法,並覆蓋預設實現。

public class car implements vehicle, fourWheeler {
	default void print(){
		System.out.println("I am a four wheeler car vehicle!");
	}
}

第二個解決方法是呼叫使用超指定介面的預設方法。

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

靜態預設方法

現在,從Java8起介面也可以有靜態輔助方法。

public interface vehicle {
	default void print(){
		System.out.println("I am a vehicle!");
	}
	static void blowHorn(){
		System.out.println("Blowing horn!!!");
	}
}

預設方法範例

使用所選擇的任何編輯器建立下面的java程式 C:/> 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("I am a vehicle!");
   }
   static void blowHorn(){
      System.out.println("Blowing horn!!!");
   }
}

interface FourWheeler {
   default void print(){
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {
   public void print(){
      Vehicle.super.print();
      FourWheeler.super.print();
	  Vehicle.blowHorn();
      System.out.println("I am a car!");
   }
}

驗證結果

使用javac編譯器編譯如下類

C:\JAVA>javac Java8Tester.java

現在執行Java8Tester看到的結果

C:\JAVA>java Java8Tester

看到結果。

I am a vehicle!                                                          
I am a four wheeler!  
Blowing horn!!!                                                   
I am a car!