原文鏈接:https://liushiming.cn/2020/02/25/why-doesnt-java-support-multiple-inheritance/
概述
多重繼承是面向對象概念的一個特性,其中一個類可以繼承多個父類的屬性。當超類和子類中都存在具有相同簽名的方法時,就會出現問題。在調用該方法時,編譯器無法確定要調用哪個類方法,甚至在調用哪個類方法時也無法確定優先級。
java不支持類的多繼承,但是可以通過接口或內部類來曲線實現多繼承。
為什么不支持多繼承
請看下面的代碼,它將編譯報錯:
public class MultiInheritTest {
@Test
public void SonTest() {
Son son = new Son();
/**
* 編譯報錯:
* 模棱兩可的方法調用。
* son對象不知道是調用Parent1的fun()還是Parent2的fun()。
*/
son.fun();
}
}
class Parent1 {
public void fun() {
System.out.println("parent1");
}
}
class Parent2 {
public void fun() {
System.out.println("parent2");
}
}
// 編譯報錯: 類不支持多繼承
class Son extends Parent1, Parent2 {
}
輸出:
compile error
以上例子可以看出,當多個父類有同樣的方法簽名時,子類將不知道調用哪一個父類的方法。
鑽石問題
GrandParent
/ \
/ \
Parent1 Parent2
\ /
\ /
Son
// 祖父類
class GrandParent
{
void fun()
{
System.out.println("Grandparent");
}
}
// 父類1
class Parent1 extends GrandParent
{
void fun()
{
System.out.println("Parent1");
}
}
// 父類2
class Parent2 extends GrandParent
{
void fun()
{
System.out.println("Parent2");
}
}
// Error : 不支持多繼承
class Test extends Parent1, Parent2
{
public static void main(String args[])
{
Test t = new Test();
t.fun();
}
}
為了避免這種復雜性,java不支持多繼承
簡化復雜性
多繼承帶來很多復雜性,容易在各種操作過程中產生問題,比如強制類型轉換、構造函數鏈接等,而最重要的原因是,實際上需要多繼承的場景非常少,所以為了保持事情的簡單和直觀,干脆不支持多繼承。
參考資料
geeksforgeeks - Java and Multiple Inheritance