2014-08-28 139 views

回答

6

繼承是實現子類型的一種方式。從Wikipedia摘自:

在編程語言理論,子類型(也亞型多態性或包含多態性)的類型是多態的形式,其中一個亞型是由某些概念相關的其它數據類型(超類型)數據類型,這意味着程序元素,通常是子程序或函數,編寫成對超類型的元素進行操作,也可以對子類型的元素進行操作。

總之,讓我們來看看這個:

class Super { 
} 

class Child extends Super { 
} 

這是遺傳,因爲ChildSuper繼承一切。

Super super = new Child(); 

這是子類型,因爲我們是ChildSuper。所以當我說繼承允許你執行子類型時,你應該明白我的意思,但它們不是一回事。

例如,你可以用接口實現子類型:

class Child extends Super implements ISomeInterface { 
} 

現在,我們可以參考Child爲:

ISomeInterface someInterface = new Child(); 

在這裏,我們指的是它作爲類型ISomeInterface,無需要繼承關係。

您的問題

Java中的所有ObjectsObject類型的子類。他們含蓄extends Object在他們的類頭。這只是語言工作的方式。所以是的,每個對象都是類Object的子類型。

在Java中,只有通過使用關鍵字extends才能獲得繼承。

額外的閱讀

編輯

聽一切馬爾科Topolnik說。他很聰明,你知道。

+0

你是否在暗示'Child'不會繼承'ISomeInterface'的形式?它沒有繼承什麼項目? – 2014-08-28 16:27:27

+0

它不從接口繼承任何東西。類*實現*接口。 – christopher 2014-08-28 18:11:12

+0

什麼,特別是它不會繼承?實際上,試圖反駁這個說法:類繼承了*從接口繼承*的所有東西。 – 2014-08-28 18:29:01

1

繼承是顯式的,子類型是隱式的。

一切(基本類型除外)都是對象的子類型。如果您明確使用extends關鍵字,那麼您正在使用繼承。

參見:Inheritance is not subtyping

1

亞型指的接口的兼容性。如果可以在類型A的對象上調用的每個函數也可以在類型B的對象上調用,則類型B是A的子類型。

繼承指的是實現的重用。 B型從其他類型A繼承,如果對於B某些功能寫在

通常A的功能而言,一個子類可以使用所有的方法,自其超,繼承不需要這個

來源:here

5

的腳註寫道:

碰巧的「亞型」的概念並不完全符合「繼承」:沒有超級接口等確實的Object亞型(§ 4.10.2. Subtyping among Class and Interface Types ),即使它們不從Object繼承。

接口只能擴展其他的接口 - 他們沒有真正extends Object明示或暗示。然而,所有的Object方法在每個接口上都可用。這使得像List<>一個亞型Object接口--IT具有所有Object將有方法的簽名 - 儘管接口本身不繼承實現從Object類這些方法

3

繼承和子類型是兩個單獨的概念。一個類型只能繼承它的父類型;因此繼承關係與子類型有關係。然而,反過來並不成立:子類型不一定從父類繼承任何東西。語言規則完全規定了子類型繼承的內容。

在Java的示例中,私有成員不會被繼承。在Java 8中,接口可以聲明靜態方法,但是它們的子類型不會繼承這些成員。