java8在接口中引入了默認方法,通過在方法前加上default關鍵字就可以在接口中寫方法的默認實現,有點類似於C++中的多繼承,但是當多個接口或父類中有相同簽名的方法時,會引發一些問題,經過實驗得出如下結論:
1.當繼承的父類和實現的接口中有相同簽名的方法時,優先使用父類的方法。
2.當接口的父接口中也有同樣的默認方法時,就近原則調用子接口的方法。
3.當實現的多個接口中有相同簽名的方法時,必須在實現類中通過重寫方法解決沖突問題,否者無法通過編譯,在重寫的方法中可以通過 接口名.super.方法名(); 的方式顯示調用需要的方法。
例子如下:
有一個類和兩個接口
public class A { public void methods(){ System.out.println("Object A methods"); } }
public interface B { default void methods(){ System.out.println("interface B methods"); } }
下面通過一個類繼承自A並且實現B接口:public interface C { default void methods(){ System.out.println("interface C methods"); } }
public class Test extends A implements B{ public static void main(String[] args){ System.out.println("HelloWord!"); Test test = new Test(); test.methods(); } }根據就近原則test將調用父類A的方法並輸出"Object A methods"
如果一個類同時實現了接口B和C:
通過使用Override重寫的方式解決沖突問題,並且在Override方法中通過B.super.methods();的方式顯示指定調用B接口中methods方法,最終輸出結果為:“interface B methods”public class Test1 implements B, C {public static void main(String[] args){ System.out.println("HelloWord!"); Test1 test1 = new Test(); test1.methods(); } @Override public void methods() { B.super.methods(); } }