背景
java中實現(xiàn)接口的類必須為接口中定義的每個方法提供一個實現(xiàn),或者從父類中繼承它的實現(xiàn)坦康。這樣就導致了一個問題,一旦接口更新卑笨,那么所有實現(xiàn)類為了適配新的接口也必須進行修改仑撞。
為解決這一問題,Java 8允許在接口內(nèi)聲明靜態(tài)方法隧哮,其二沮翔,Java 8引入了一個新功能,叫默認方法采蚀。
使用
如何判別一個方法來源于何處?
如果一個類使用相同的函數(shù)簽名從多個地方(比如另一個類或接口)繼承了方法纲爸,通過三條規(guī)則可以進行判斷妆够。
(1) 類中的方法優(yōu)先級最高。類或父類中聲明的方法的優(yōu)先級高于任何聲明為默認方法的優(yōu) 先級神妹。
(2) 如果無法依據(jù)第一條進行判斷,那么子接口的優(yōu)先級更高:函數(shù)簽名相同時冕茅,優(yōu)先選擇 擁有最具體實現(xiàn)的默認方法的接口蛹找,即如果B繼承了A,那么B就比A更加具體姜挺。
(3) 最后彼硫,如果還是無法判斷凌箕,繼承了多個接口的類必須通過顯式覆蓋和調(diào)用期望的方法词渤,顯式地選擇使用哪一個默認方法的實現(xiàn)。
例:下面代碼會打印什么
public interface A {
default void hello() {
System.out.println("Hello from A");
}
}
public interface B extends A {
default void hello() {
System.out.println("Hello from B");
}
}
public class C implements B, A {
public static void main(String... args) {
new C().hello();
}
}
類C沒有提供hello的實現(xiàn)芜壁,所以按照規(guī)則(2)高氮,應該選擇的是提供了最具體實現(xiàn)的 默認方法的接口。由于B比A更具體剪芍,所以應該選擇B的hello方法。所以饱普,程序會打印輸出“Hello from B”状共。