2016-11-28 91 views
1

當我創建一個新的類,它是Java中的每個子類都從兩個類(Object及其超類)繼承?

ClassA extends Object{ 
} 

所以,如果我有從的ClassA ClassB的繼承,那豈不是

ClassA extends Object extends ClassB { 
} 

這基本上是多重繼承,是不是允許在Java中。

或者對於Object類有一個特殊的例外,這意味着它確實可以安全地說,Java中的每個基類繼承了兩個類

+3

多繼承有兩個直接的超類。相反,這是一個類層次結構,其中'B'擴展'A',繼而擴展'Object'。 –

+0

Object的唯一特殊例外是:「extends子句不能出現在類Object的定義中,或者發生編譯時錯誤,因爲它是原始類,並且沒有直接的超類。」 (來自[JLS Sec 8.1.4](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.4)) –

回答

8

這將是ClassA繼承自繼承自Object的ClassB。

這不是多重繼承。這是單一繼承。單繼承給你的排序鏈的:

Object -> ClassB -> ClassA 

多重繼承讓你做更多的樹:

Object -> ClassB \ 
        ---> ClassA 
Object -> ClassC/

Java並不讓你做後者。你可以得到最接近的是實現多個接口。

注意,這仍然是OK(單繼承),因爲每類最多有一個直接基:

    /--> ClassC 
Object -> ClassB - 
        \--> ClassD 

另外,回答你直接的問題,JLS 8.1.4 states(重點煤礦):

給定一個...類聲明...類類型C ...的直接超類是如果存在extends子句,則在C的聲明的extends子句中給出的類型,否則爲Object。

也就是說,它仍然是單一繼承。如果你有一個extends那麼這就是基類,否則基數是Object。在你的例子中,ClassA沒有Object作爲直接基地


你也可以嘗試一下自己。 Check out this example

static class ClassB { 
} 

static class ClassA extends ClassB { 
} 

static void printHierarchy (Class<?> clz) { 
    if (clz != null) { 
     System.out.println(clz.getSimpleName()); 
     System.out.print("inherits from: "); 
     printHierarchy(clz.getSuperclass()); 
    } else { 
     System.out.println("nothing"); 
    } 
} 

public static void main (String[] args) { 
    printHierarchy(ClassA.class); 
} 

輸出:

ClassA 
inherits from: ClassB 
inherits from: Object 
inherits from: nothing 
1

Java不支持多重繼承。相反,你所描述的是一個階級階層。 Java中沒有明確擴展類的所有類擴展爲Object。但是,如果類A延伸B,那麼它不直接延伸Object。因爲B直接延伸Object,A仍然是子類Object(因爲在你可以做Object a = new A()沒有任何問題),但它不是一個直接的子類。

+0

@Andreas我並不打算至。我會編輯我的答案。謝謝。 –