如何使用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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP