一、引入背景
1. 當一個接口添加新方法時,需要所有的實現類都重寫新方法,影響到了已有的實現類,可能導致應用崩潰
2. 默認方法可以不強制重寫,也不會影響到已有的實現類
3. 例如Iterable接口的foreach方法,就是一個默認方法,參數是一個Consumer對象
二、概念
1. 接口提供一個默認實現的方法,並且不強制實現類重寫此方法
2. 默認方法使用default關鍵字來修飾
三、使用
1. 當一個實現類實現了多個接口,多個接口里都有相同的默認方法時,實現類必須重寫該默認方法,否則編譯錯誤
a. 實現類自己重寫邏輯
b. 實現類使用super關鍵字指定使用哪個接口的默認方法
2. 接口靜態方法
接口中支持定義靜態方法,將默認方法的default關鍵字換成static即可
3. 繼承類可以直接使用接口中的static方法,也可以創建對象后使用接口中的default方法
代碼
- 實現類會繼承接口中的default方法
如果接口A中有default方法:
1 public interface A {
2 public default void a(){ 3 System.out.println("這是A"); 4 } 5 }
Test類實現接口A:
1 public class Test implements A{
2
3 }
那么Test類將會繼承接口A中的a方法:
1 public class Test2 {
2 public static void main(String[] args) { 3 Test t = new Test(); 4 t.a(); 5 } 6 }
- 如果一個類同時實現接口A和B,接口A和B中有相同的default方法,這時,該類必須重寫接口中的default方法
為什么要重寫呢?是因為,類在繼承接口中的default方法時,不知道應該繼承哪一個接口中的default方法。
- 如果子類繼承父類,父類中有b方法,該子類同時實現的接口中也有b方法(被default修飾),那么子類會繼承父類的b方法而不是繼承接口中的b方法
接口A:
1 public interface A { 2 public default void b(){ 3 System.out.println("AAA"); 4 } 5 }
類C:
1 public class C { 2 public void b(){ 3 System.out.println("CCC"); 4 } 5 }
子類:
1 public class Test extends C implements A{ 2 3 }
測試類:
說明子類繼承的b方法為父類C中的b方法,不是接口中的default b(){}方法。