『壹』 Java中,組合和繼承的區別
1.組合(has-a)關系可以顯式地獲得被包含類(繼承中稱為父類)的對象,而繼承(is-a)則是隱式地獲得父類的對象,被包含類和父類對應,而組合外部類和子類對應。
2.組合關系在運行期決定,而繼承關系在編譯期就已經決定了。
3.組合是在組合類和被包含類之間的一種松耦合關系,而繼承則是父類和子類之間的一種緊耦合關系。
4.當選擇使用組合關系時,在組合類中包含了外部類的對象,組合類可以調用外部類必須的方法,而使用繼承關系時,父類的所有方法和變數都被子類無條件繼承,子類不能選擇。
5.最重要的一點,使用繼承關系時,可以實現類型的回溯,即用父類變數引用子類對象,這樣便可以實現多態,而組合沒有這個特性。
6.還有一點需要注意,如果你確定復用另外一個類的方法永遠不需要改變時,應該使用組合,因為組合只是簡單地復用被包含類的介面,而繼承除了復用父類的介面外,它甚至還可以覆蓋這些介面,修改父類介面的默認實現,這個特性是組合所不具有的。
7.從邏輯上看,組合最主要地體現的是一種整體和部分的思想,例如在電腦類是由內存類,CPU類,硬碟類等等組成的,而繼承則體現的是一種可以回溯的父子關系,子類也是父類的一個對象。
8.這兩者的區別主要體現在類的抽象階段,在分析類之間的關系時就應該確定是採用組合還是採用繼承。
9.引用網友的一句很經典的話應該更能讓大家分清繼承和組合的區別:組合可以被說成「我請了個老頭在我家裡幹活」 ,繼承則是「我父親在家裡幫我幹活"。