java為什么不支持多繼承


原文鏈接: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


免責聲明!

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



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