《Java程序猿面試筆試寶典》之組合與繼承有什么差別


組合和繼承是面向對象中兩種代碼復用的方式。

組合是指在新類里面創建原有類的對象,反復利用已有類的功能。繼承是面向對象的主要特性之中的一個,它同意設計人員依據其他類的實現來定義一個類的實現。

組合和繼承都同意在新的類中設置子對象(subobject),僅僅是組合是顯式的,而繼承則是隱式的。組合和繼承存在着相應關系:組合中的總體類和繼承中的子類相應。組合中的局部類和繼承中的父類相應。

二者的差別在哪里呢?首先分析一個實例。Car表示汽車對象,Vehicle表示交通工具對象,Tire表示輪胎對象。三者的類關系下圖 所看到的。


       從上圖中能夠看出。Car是Vehicle的一種,因此是一種繼承關系(又被稱為“is-a”關系)。而Car包括了多個Tire,因此是一種組合關系(又被稱為“has-a”關系)。

事實上現方式例如以下:

繼承

組合

class Verhicle{

}

class Car extends Verhicle{

 

}

class Tire{

}

class Car extends Verhicle{

       private Tire t=new Tire();

}

       既然繼承和組合都能夠實現代碼的重用,那么在實際使用的時候又該怎樣選擇呢?普通情況下,遵循下面兩點原則。

(1)       除非兩個類之間是“is-a”的關系,否則不要輕易地使用繼承,不要單純地為了實現代碼的重用而使用繼承,由於過多地使用繼承會破壞代碼的可維護性。當父類被改動的時候,會影響到全部繼承自它的子類,從而添加程序的維護難度與成本。

(2)       不要僅僅為了實現多態而使用繼承,假設類之間沒有“is-a”的關系。能夠通過實現接口與組合的方式來達到同樣的目的。設計模式中的策略模式能夠非常好的說明這一點,採用接口與組合的方式比採用繼承的方式具有更好的可擴展性。

由於Java語言僅僅支持單繼承,假設想同一時候繼承兩個類或多個類。在Java中是無法直接實現的。

同一時候,在Java語言中。假設繼承使用太多,也會讓一個class里面的內容變得臃腫不堪。所以,在Java語言中。能使用組合的時候盡量不要使用繼承。


出自新書《Java程序猿面試筆試寶典》官網


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com