一、菱形繼承的概念
菱形繼承又叫做鉆石繼承,指的是不同的類同時繼承自相同的父類,存在一個子類同時繼承這些不同的類,即我們常說的“多繼承”問題。
例如:B類和C類分別繼承A類,而D類同時繼承B類和C類。

?二、代碼演示
我們通過IDEA分別創建A、B、C和D類,演示存在的問題:
public class A {public void sayHi(){System.out.println("我是A");}
}public class B extends A{public void sayHi(){System.out.println("我是B");}
}public class C extends A{public void sayHi(){System.out.println("我是C");}
}public class D extends B,C{public void sayHi(){System.out.println("我是D");}
}
接下來我們創建主函數:
public class Main {public static void main(String[] args) {B b=new B();b.sayHi();C c=new C();c.sayHi();D d=new D();d.sayHi();}
}
當我們點擊運行按鈕,會提示該內容報錯:
很顯然,我們的代碼不存在任何問題。IDEA認為此處有語法錯誤,因為Java默認不支持對多個類的繼承。
三、問題分析
1. 上述的示例代碼比較簡單,如果業務代碼的邏輯比較復雜,多繼承會導致編程的難度大大提升,會增加代碼的復雜度。(Java并不支持)
2. 如果可以支持多繼承,那么我們需要根據上述案例思考:如果D類可以同時繼承B類和C類且不進行方法的重寫,當我們在主函數中進行調用D類的 sayHi() 方法時,到底該調用父類B類的方法呢,還是該調用父類C類的方法呢?這就導致我們的程序的方法的調用存在二義性的問題。
3. 如果可以支持多繼承,子類同時繼承多個父類,子類的子類又同時繼承多個父類,以此循環往復,這不就是傳說中的套娃嗎?多繼承會導致我們的程序存在“多繼承的膨脹性‘,會增加繼承層次的復雜性和混亂性。
四、我能想到的解決方案
1. 依據設計模式,我們可以實現:對其他類進行組合,復用其他類的功能
2. 繼承一個類的同時實現某些接口:實現對父類的功能的增強和拓展其他功能
3. 實現多個接口:因為Java支持一個類實現多個接口,實現類似的多繼承的效果
4.1 演示實現多接口
分別創建 IPlay 接口和 ISayhi 接口:
public interface IPlay {public abstract void play();
}public interface ISayhi {public abstract void sayHi();
}
修改D類的代碼:
public class D implements ISayhi,IPlay{public void sayHi(){System.out.println("我是D");}@Overridepublic void play() {System.out.println("我可以玩");}
}
主函數進行調用:
public class Main {public static void main(String[] args) {B b=new B();b.sayHi();C c=new C();c.sayHi();D d=new D();d.sayHi();d.play();}
}
輸出結果如下: