如何使用Java中的預設方法解決菱形問題


繼承是兩個類之間的關係,其中一個類繼承另一個類的屬性。這種關係可以使用extends關鍵字定義為:

public class A extends B{

}

繼承屬性的類稱為子類或子類,其屬性被繼承的類稱為超類或父類。

在繼承中,超類成員的副本在子類物件中建立。因此,使用子類物件,您可以訪問這兩個類的成員。

多重繼承是指一個類繼承多個類的屬性。換句話說,在多重繼承中,我們可以有一個子類和n個父類。Java不支援多重繼承(使用類)。

菱形問題

  • 例如,讓我們假設Java支援多重繼承。
  • 如果我們有一個名為Sample的抽象類,其中包含一個抽象方法demo()。
  • 然後,如果同一包中的另外兩個類擴充套件此類並嘗試實現其抽象方法demo()。
  • 那麼,根據繼承的基本規則,應該在子類物件中建立兩個demo()方法的副本,這使得子類有兩個具有相同原型(名稱和引數)的方法。
  • 然後,如果您使用子類物件呼叫demo()方法,編譯器將面臨一個不明確的情況,不知道要呼叫哪個方法。這個問題在Java中被稱為菱形問題。

菱形問題的解決方案

您可以使用預設方法(Java 8)和介面在Java中實現多重繼承。

從Java 8開始,在介面中引入了預設方法。與其他抽象方法不同,這些是具有預設實現的介面方法。如果您在介面中具有預設方法,則不必在已經實現此介面的類中覆蓋(提供主體)它。

您可以在兩個不同的介面中擁有相同的預設方法(相同的名稱和簽名),並且您可以從一個類實現這兩個介面。

如果您這樣做,則必須顯式地覆蓋來自類的預設方法,並同時指定預設方法及其介面名稱。

示例

線上演示

interface MyInterface1{  
   public static int num = 100;
   public default void display() {
      System.out.println("display method of MyInterface1");
   }
}
interface MyInterface2{  
   public static int num = 1000;
   public default void display() {
      System.out.println("display method of MyInterface2");
   }
}  
public class InterfaceExample implements MyInterface1, MyInterface2{
   public void display() {
      MyInterface1.super.display();
      //or,
      MyInterface2.super.display();
   }      
   public static void main(String args[]) {
      InterfaceExample obj = new InterfaceExample();
      obj.display();
   }
}

輸出

display method of MyInterface1
display method of MyInterface2

更新於:2021年2月8日

13K+ 瀏覽量

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.