Java繼承和組合的區別

2021-06-13 14:41:53 字數 686 閱讀 7709

1)組合(has-a)關係可以顯式地獲得被包含類(繼承中稱為父類)的物件,而繼承(is-a)則是隱式地獲得父類的物件,被包含類和父類對應,而組合外部類和子類對應。

2)組合關係在執行期決定,而繼承關係在編譯期就已經決定了。

3)組合是在組合類和被包含類之間的一種松耦合關係,而繼承則是父類和子類之間的一種緊耦合關係。

4)當選擇使用組合關係時,在組合類中包含了外部類的物件,組合類可以呼叫外部類必須的方法,而使用繼承關係時,父類的所有方法和變數都被子類無條件繼承,子類不能選擇。

5)最重要的一點,使用繼承關係時,可以實現型別的回溯,即用父類變數引用子類物件,這樣便可以實現多型,而組合沒有這個特性。

6)還有一點需要注意,如果你確定復用另外乙個類的方法永遠不需要改變時,應該使用組合,因為組合只是簡單地復用被包含類的介面,而繼承除了復用父類的介面外,它甚至還可以覆蓋這些介面,修改父類介面的預設實現,這個特性是組合所不具有的。

7)從邏輯上看,組合最主要地體現的是一種整體和部分的思想,例如在電腦類是由記憶體類,cpu類,硬碟類等等組成的,而繼承則體現的是一種可以回溯的父子關係,子類也是父類的乙個物件。

8)這兩者的區別主要體現在類的抽象階段,在分析類之間的關係時就應該確定是採用組合還是採用繼承。

9)引用網友的一句很經典的話應該更能讓大家分清繼承和組合的區別:組合可以被說成「我請了個老頭在我家裡幹活」 ,繼承則是「我父親在家裡幫我幹活"。

Java 繼承與組合的區別

根據網路上大家對繼承和組合的討論,我簡單總結以下幾點 1 組合 has a 關係可以顯式地獲得被包含類 繼承中稱為父類 的物件,而繼承 is a 則是隱式地獲得父類的物件,被包含類和父類對應,而組合外部類和子類對應。2 組合關係在執行期決定,而繼承關係在編譯期就已經決定了。3 組合是在組合類和被包含...

Java 組合與繼承的區別

組合和繼承都允許在新的類中放置子物件,組合是顯式地這樣做,而繼承是隱式地做。那兩者之間的區別是怎樣的呢?又該如何選擇呢?很多人對組合理解地還不是很好,所以我們先來理解一下組合 組合技術通常用於想在新類中使用現有類的功能而非它的介面這種情況。以car物件舉例 composition with publ...

Java 繼承與組合的區別

根據網路上大家對繼承和組合的討論,我簡單總結以下幾點 1 組合 has a 關係可以顯式地獲得被包含類 繼承中稱為父類 的物件,而繼承 is a 則是隱式地獲得父類的物件,被包含類和父類對應,而組合外部類和子類對應。2 組合關係在執行期決定,而繼承關係在編譯期就已經決定了。3 組合是在組合類和被包含...