1. 程式人生 > >為何Java 類不支援多繼承?

為何Java 類不支援多繼承?

1.問題由來

本文部分內容引自此處,感興趣者可以直接檢視原連結。

Java語言特性之一是, 確切的說,其類對於多繼承是不支援的(介面可以多繼承),但是這是為什麼呢?記得Thinking in Java中對於該問題有所闡述,單繼承時,JVM的GC機制很好實現,有沒有其他更深層次的原因呢?

2.問題解釋

     A foo()
       / \
      /   \
  B foo()   C foo()
      \   /
       \ /
      D foo()

1). 首先是上圖所示的‘鑽石問題’。如果我們這時要呼叫的是foo()方法,編譯器並不知道呼叫的是哪一個類的方法,這就會很尷尬了。

class A{
    public void foo(){
    }
}
class B extends A{
    public void foo(){
    }
}
class C extends A{
    public void foo(){
    }
}
//Not allowed here.
public class D extends B, C{
    public void foo(){
    }
}

但我們知道,其實C++中是支援多繼承這個特性的,那麼為什麼Java不支援呢?下面會給出該問題的解答,其實這並不是一個技術上的問題,而是設計風格的問題,Java語言設計之初將其可維護性和設計的簡潔性放在了很重要的地位,因而採取了單繼承的策略。
2). 第二個原因是:多繼承使得系統設計很繁雜,而且在型別轉換、鏈式建構函式等問題上代價很大;而且考慮到沒有很多地方用到多繼承,所以取消多繼承的決定是為了語言的簡潔性考慮的。

3.進一步討論

Java中interface可以extends多個interface;
Java中class可以implements多個interface
Java中的class只能extends 一個class。
Q: 為何Java可以支援實現多個介面?
A: 因為介面只有方法的宣告部分,並沒有提供方法實現,因而特定的方法只有一種實現,故而不會產生二義性。
Java實現多繼承的方式

interface A{
    void test();
}
interface B{
    void test();
}
class C implements
A,B{
@Override public void test(){ } }