2013-10-04 72 views
-1

我讀過每個類默認擴展一個對象類。那麼它應該導致多重繼承,並且不能被Java支持。每個類都擴展Object?

請搜索很多,但無法得到正確的答案/編譯器如何在這種情況下工作。請幫助我。

+0

是的......但多重繼承是**不是**這個 – ppeterka

+1

不是每個類_directly_擴展了'Object'。給定'A類擴展對象'和'B類擴展A','A'直接擴展'Object','B'直接擴展'A','B'通過'A'間接擴展'Object'。如果'B'通過兩條不同的路徑擴展了'Object',那麼只有鑽石問題。一個類有多個超類並不一定意味着你有多重繼承。 –

回答

4

它怎麼可能是多重繼承?

class Object { /* stuff */ } 

class Foo /* implicit extends Object */ {} 

class FooBar extends Foo /* and therefore extends Object */ {} 

The rules are described in the Java Language Specification

類對象所有其他類的超類(§8.1.4)。

+0

編譯器是如何知道的?任何機構都告訴我編譯器是如何工作的? – user2848012

+0

@ user2848012編譯器如何知道什麼?規則在Java語言規範中指定。爲了使編譯器與Java兼容,它需要遵循這些規則。 –

14

當你有像

class A {} 

然後A隱含延伸Object。事實上字節碼類似

class A extends Object {} 

現在,如果我們有

class B extends A {} 

然後B延伸A,但Object一個子類,因爲AObject子類。這是沒有,不過,多重繼承:

 
Object 
    | 
    A 
    | 
    B 

多重繼承應該是這樣的:

 
Object A 
    \ /
    \ /
    \/
    B 

B從兩個層次無關的類繼承。

0

類對象是類層次結構的根。每個類都有Object作爲超類。所有對象,包括數組,都實現了這個類的方法。 Java documentation

1

您的困惑似乎在術語「多重繼承」中。多重繼承指對象可以是多於一個其他類型的DIRECT後代。

這將是多重繼承的一個例子,在Java中不支持:

class Z extends A, B, C{ 

} 
0

多重繼承意味着一個類從多個類不在同一行的繼承繼承。多重繼承的問題是,如果方法和實例變量具有相同的名稱,但具有不同的操作或值,則不清楚要使用哪一個繼承的方法或變量。

例如:

class Foo { 
    void baz() { } 
} 
class Bar { 
    void baz() { System.out.println("test"); } 
} 
class FooBar extends Foo extends Bar {} 

是多重繼承的一個例子。如果FooBar類的一個對象叫做baz(),我們不會知道使用哪個baz()。

但是,如果類FooBar只擴展Foo類,而不是類Bar(和類Foo擴展類Object),那麼它不是多繼承。如果Object中的方法(如toString())要寫入Foo,則此方法將覆蓋Object的toString(),即類FooBar會知道子類Foo的toString()應該被調用,而不是父類, Object的toString()。

1

當你看一個類,例如A,查找繼承樹將始終返回到Object。如果AObject之間有多個類別,則這不是多重繼承。由此可得出像這樣:當一個類是繼承樹至少有兩個「分支」的子發生

Object 
| 
SomeIntermediateClass 
| 
A 

多重繼承。例如:

Object 
| | 
A B 
\/
    C 

在上述情況下,C從多個父母繼承,並因此參與多繼承。

相關問題