2014-04-05 24 views
1

在java中這兩個事實「Java所有的類擴展元類對象」是否意味每個子類中導致鑽石問題

事實1

在默認情況下,Java所有的類擴展了Java元類Object

事實2

多重繼承不允許在Java」在此處詳細瞭解鑽石proble Java inheritance

安靜混亂

假設ClassB延伸ClassA然後根據fact1 ClassB延伸Object

enter image description here

這是否意味着ClassB擴展ClassAObject?這是多重繼承的情況嗎?

如果它不是多重繼承,那麼這兩個語句怎麼不矛盾呢?

+0

將其作爲質量保證知識共享 – veer7

+0

答案更新示例 –

+0

在事實1中,「默認情況下」是該概念的關鍵。 –

回答

2

是的,這兩個陳述都是正確的。

確實,java中的每個類都擴展了元類Object

Still ClassB沒有多重繼承,因爲在編譯時java將Object類移動了一個級別。

enter image description here

這種方式現在ClassA現在擴展Object,而不是ClassB

這種方式ClassB沒有多重繼承,所以我們遵循了事實2。

現在ClassB延伸ClassA因此ClassA延伸Object通過多級繼承 ClassB的延伸Object; fact1其次

6

「在默認情況下的Java的每個類擴展了Java元類對象」 // fact1

每類擴展Object類,只如果他們不直接擴展任何其他類

如果一個類Test擴展了另一個Sample類,然後Test不直接延伸Object類,但是,通過超類Sample,這直接擴展Object類繼承Object類的行爲。

3

感謝您提供您的事實來源。現在我可以進入一些細節。

208頁的 「深入淺出Java第二版」 說:

Java所有的類擴展對象

類對象是所有類的母親;它是的一切的超類。

段落再往下它說:

你寫的每一個類繼承的對象,沒有你永遠不必說了吧。 [...]能想到的它,就好像你寫一個類看起來是這樣的:public class Dogextends Object{ } [...]狗已經延伸的東西,。 [...]編譯器會讓Canine擴展Object。

雖然他們試圖進行溝通(在Java中每個類都有java.lang.Object一個超類)的總體思路是正確的,他們使用的是錯誤的術語,並且使用Dog的例子是完全錯誤的,並這會導致你的困惑。

我寫了一個Java編譯器(用於Java 1.4),我對Java語言規範非常熟悉,請耐心等待。

爲了證明術語是「Head First Java」是錯誤的,我需要引用來自Java語言規範,這是有點技術性的。

但是,我可以給你一個更簡單的解釋,你可以看到這一點。

更好的定義

Java所有的類,沒有extend另一個階級明確,擴展Object

當你寫:

class Canine { } 

那麼編譯器採用此意思是:

class Canine extends Object { } 

但是,當你寫:

class Dog extends Canine { } 

那麼編譯器看到你已經明確地擴展一個類, 不會改變你的代碼的含義。

由於Head First Java第二版基於Java 5,因此我將使用該Java版本的Java語言規範。

含義延伸section 8.1.4 of the JLS定義:

8.1.4超類和子類

可選延伸子句中一個普通的類聲明指定 的直接超類當前班級的

Super: 
    extends ClassType 

正如你看到的,延伸僅指直接超。在Head First Java的例子中,Dog不擴展Object,因爲它的直接超類是Canine。只有擴展對象。

他們的意思是說,Object是Java中所有其他類的超類。這在JLS section 4.3.2定義:

4.3.2類對象

Object是所有其他類的超類(第8.1節)。 A 類型爲Object的變量可以持有對null參考 或對任何對象的引用,無論它是類別實例還是數組 (第10節)。所有類和數組類型繼承 Object類的方法,[...]

我怕你被這在頭第一個Java的第二版呈現的誤導的方式牽制。 希望已經在新版本中解決了這個問題(如果有人有,請確認/反駁),否則我們應該通知作者。

+0

請參閱Head First Java第2版,(第208頁)。 – veer7

+0

它用粗體書寫「Java中的每個類都擴展了類對象」。並且「編譯器將使Canine擴展對象變爲」 – veer7

+0

您引用了「Java中的每個類hasObject作爲祖先,但是說Java中的每個類extendsObject都是不正確的。」請給我指出任何可能會幫助我更好地理解它的文檔或參考。 – veer7