Java 接口中的default方法


一、引入背景

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(){}方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM