基於this answer末尾的註釋,它看起來像子類型和繼承是Java中微妙不同的概念。它是什麼?僅當類聲明包含extends ...
子句時才繼承?如果是這種情況,那麼一個類將不會從Object繼承,即使它是它的一個子類型,對吧?JAVA:子類型和繼承的概念是一樣的嗎?
回答
繼承是實現子類型的一種方式。從Wikipedia摘自:
在編程語言理論,子類型(也亞型多態性或包含多態性)的類型是多態的形式,其中一個亞型是由某些概念相關的其它數據類型(超類型)數據類型,這意味着程序元素,通常是子程序或函數,編寫成對超類型的元素進行操作,也可以對子類型的元素進行操作。
總之,讓我們來看看這個:
class Super {
}
class Child extends Super {
}
這是遺傳,因爲Child
從Super
繼承一切。
Super super = new Child();
這是子類型,因爲我們是指到Child
爲Super
。所以當我說繼承允許你執行子類型時,你應該明白我的意思,但它們不是一回事。
例如,你可以用接口實現子類型:
class Child extends Super implements ISomeInterface {
}
現在,我們可以參考Child
爲:
ISomeInterface someInterface = new Child();
在這裏,我們指的是它作爲類型ISomeInterface
,無需要繼承關係。
您的問題
Java中的所有Objects
是Object
類型的子類。他們含蓄有extends Object
在他們的類頭。這只是語言工作的方式。所以是的,每個對象都是類Object
的子類型。
在Java中,只有通過使用關鍵字extends
才能獲得繼承。
額外的閱讀
的Liskov Substitution Principle是一個設計原則,在很大程度上側重於亞型
The different relationships Java類之間的想法。這將有助於您更深入地瞭解OOP。
編輯
聽一切馬爾科Topolnik說。他很聰明,你知道。
亞型指的接口的兼容性。如果可以在類型A的對象上調用的每個函數也可以在類型B的對象上調用,則類型B是A的子類型。
繼承指的是實現的重用。 B型從其他類型A繼承,如果對於B某些功能寫在
通常A的功能而言,一個子類可以使用所有的方法,自其超,繼承不需要這個
來源:here
的腳註寫道:
碰巧的「亞型」的概念並不完全符合「繼承」:沒有超級接口等確實的
Object
亞型(§ 4.10.2. Subtyping among Class and Interface Types ),即使它們不從Object
繼承。
接口只能擴展其他的接口 - 他們沒有真正extends Object
,明示或暗示。然而,所有的Object
方法在每個接口上都可用。這使得像List<>
一個亞型Object
接口--IT具有所有Object
將有方法的簽名 - 儘管接口本身不繼承實現從Object
類這些方法。
繼承和子類型是兩個單獨的概念。一個類型只能繼承它的父類型;因此繼承關係與子類型有關係。然而,反過來並不成立:子類型不一定從父類繼承任何東西。語言規則完全規定了子類型繼承的內容。
在Java的示例中,私有成員不會被繼承。在Java 8中,接口可以聲明靜態方法,但是它們的子類型不會繼承這些成員。
你是否在暗示'Child'不會繼承'ISomeInterface'的形式?它沒有繼承什麼項目? – 2014-08-28 16:27:27
它不從接口繼承任何東西。類*實現*接口。 – christopher 2014-08-28 18:11:12
什麼,特別是它不會繼承?實際上,試圖反駁這個說法:類繼承了*從接口繼承*的所有東西。 – 2014-08-28 18:29:01