感謝您提供您的事實來源。現在我可以進入一些細節。
208頁的 「深入淺出Java第二版」 說:
Java所有的類擴展對象
類對象是所有類的母親;它是的一切的超類。
段落再往下它說:
你寫的每一個類繼承的對象,沒有你永遠不必說了吧。 [...]能想到的它,就好像你寫一個類看起來是這樣的:public class Dog
extends 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的第二版呈現的誤導的方式牽制。 希望已經在新版本中解決了這個問題(如果有人有,請確認/反駁),否則我們應該通知作者。
將其作爲質量保證知識共享 – veer7
答案更新示例 –
在事實1中,「默認情況下」是該概念的關鍵。 –