Java中繼承和組合的區(qū)別
什么是繼承
繼承是面向?qū)ο笕蠡咎卣髦?繼承,封裝,多態(tài)),繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
在java中通過(guò)關(guān)鍵字extends實(shí)現(xiàn)繼承,java中所有類默認(rèn)都是java.lang.Object的子類。繼承強(qiáng)調(diào)的是is-a關(guān)系。
例子:
/** * 動(dòng)物 */ public class Animal { public void breathing() { System.out.println("呼氣...吸氣..."); } }
/** * 飛行動(dòng)物 * 繼承 */ public class FlyingAnimals extends Animal{ public void filying() { System.out.println("飛行..."); } public static void main(String[] args) { FlyingAnimals flyingAnimals = new FlyingAnimals(); flyingAnimals.breathing(); flyingAnimals.filying(); } }
繼承是代碼復(fù)用的一種方式。在繼承中,父類的方法內(nèi)部實(shí)現(xiàn)細(xì)節(jié)對(duì)子類可見(jiàn),是‘白盒式’的代碼復(fù)用。
什么是組合
組合是通過(guò)對(duì)現(xiàn)有對(duì)象進(jìn)行拼裝即組合產(chǎn)生新的具有更復(fù)雜的功能。如:
/** * 動(dòng)物 */ public class Animal { public void breathing() { System.out.println("呼氣...吸氣..."); } }
/** * 爬行動(dòng)物 * 組合 */ public class Reptilia { private Animal animal; public Reptilia(Animal animal) { this.animal = animal; } public void crawling() { System.out.println("爬行..."); } public void breathing() { animal.breathing(); } public static void main(String[] args) { Animal animal = new Animal(); Reptilia reptilia = new Reptilia(animal); reptilia.breathing();; reptilia.crawling(); } }
組合體現(xiàn)的是整體和部分,強(qiáng)調(diào)的是has-a的關(guān)系。
所以組合更多的用于下面這樣的場(chǎng)景:
/** * 輪胎 */ class Tire { public void run() { System.out.println("輪胎轉(zhuǎn)動(dòng)..."); } } /** * 車燈 */ class Light { public void light() { System.out.println("燈亮..."); } }
/** * 交通工具 * 組合 */ public class Vehicle { private Tire tire; private Light light; public Vehicle(Tire tire,Light light) { this.tire = tire; this.light = light; } public void operation() { light.light(); tire.run(); } public static void main(String[] args) { Tire tire = new Tire(); Light light = new Light(); Vehicle vehicle = new Vehicle(tire,light); vehicle.operation(); } }
繼承與組合的區(qū)別與聯(lián)系
繼承與組合都是面向?qū)ο笾写a復(fù)用的方式。父類的內(nèi)部細(xì)節(jié)對(duì)子類可見(jiàn),其代碼屬于白盒式的復(fù)用,而組合中,對(duì)象之間的內(nèi)部細(xì)節(jié)不可見(jiàn),其代碼屬于黑盒式復(fù)用。
繼承在編碼過(guò)程中就要指定具體的父類,其關(guān)系在編譯期就確定,而組合的關(guān)系一般在運(yùn)行時(shí)確定。
繼承強(qiáng)調(diào)的是is-a的關(guān)系,組合強(qiáng)調(diào)的是has-a的關(guān)系。
繼承與組合的優(yōu)缺點(diǎn)
繼承的優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 支持?jǐn)U展,通過(guò)繼承父類實(shí)現(xiàn),但會(huì)使系統(tǒng)結(jié)構(gòu)較復(fù)雜易于修改被復(fù)用的代碼
缺點(diǎn): 代碼白盒復(fù)用,父類實(shí)現(xiàn)細(xì)節(jié)暴露給子類,破壞了封裝性當(dāng)父類實(shí)現(xiàn)代碼修改時(shí),可能使得子類也得修改,增加維護(hù)難度子類缺乏獨(dú)立性,依賴于父類,耦合度較高不支持動(dòng)態(tài)拓展,在編譯期就決定了父類
組合的優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 代碼黑盒復(fù)用,被包括的對(duì)象內(nèi)部實(shí)現(xiàn)細(xì)節(jié)對(duì)外不可見(jiàn),封裝性好整體類與局部類間松耦合,相互獨(dú)立支持?jǐn)U展每個(gè)類只專注于一項(xiàng)任務(wù)支持動(dòng)態(tài)擴(kuò)展,可在運(yùn)行時(shí)根據(jù)具體對(duì)象選擇不同類型的組合對(duì)象(擴(kuò)展性比繼承好)
缺點(diǎn): 創(chuàng)建整體類對(duì)象時(shí),需要?jiǎng)?chuàng)建所有局部類對(duì)象,導(dǎo)致系統(tǒng)對(duì)象很多 什么情況下使用繼承,什么情況下使用組合
從分析看,組合的優(yōu)點(diǎn)多于繼承,加上java中僅支持單繼承,所以:除非兩個(gè)類之間是is-a的關(guān)系,否則盡量用組合。
到此這篇關(guān)于Java中繼承和組合的區(qū)別的文章就介紹到這了,更多相關(guān)java的繼承和組合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot事件發(fā)布和監(jiān)聽(tīng)詳解
今天去官網(wǎng)查看spring boot資料時(shí),在特性中看見(jiàn)了系統(tǒng)的事件及監(jiān)聽(tīng)章節(jié),所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot事件發(fā)布和監(jiān)聽(tīng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11Spring Batch遠(yuǎn)程分區(qū)的本地Jar包模式的代碼詳解
這篇文章主要介紹了Spring Batch遠(yuǎn)程分區(qū)的本地Jar包模式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Spring MVC學(xué)習(xí)教程之視圖深入解析
這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)教程之視圖解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用spring mvc具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-11-11SpringBoot手動(dòng)開(kāi)啟事務(wù):DataSourceTransactionManager問(wèn)題
這篇文章主要介紹了SpringBoot手動(dòng)開(kāi)啟事務(wù):DataSourceTransactionManager問(wèn)題,具有很好的價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07JavaEE Filter敏感詞過(guò)濾的方法實(shí)例詳解
我們無(wú)論是在聊天還是在留言時(shí),都有一些信息不希望別人看到。那么如果過(guò)濾這些關(guān)鍵詞呢?下面小編給大家分享JavaEE Filter敏感詞過(guò)濾的方法實(shí)例詳解,感興趣的朋友一起學(xué)習(xí)吧2016-05-05實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)登錄接口整合阿里云短信詳情
這篇文章主要為大家介紹了實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)登錄接口整合阿里云短信詳情,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-04-04