Java中继承、接口、多态的作用详解(纯理论)
一、繼承、接口與多態(tài)的相關(guān)問題:
1、 繼承的作用?好處?壞處?
繼承:通過繼承實(shí)現(xiàn)代碼復(fù)用。Java中所有的類都是通過直接或間接地繼程java.lang.Object類得到的。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問權(quán)限為private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量。但Java不支持多重繼承,即一個(gè)類從多個(gè)超類派生的能力。
優(yōu)點(diǎn):a因?yàn)榇蟛糠质抢^承而來的,實(shí)現(xiàn)代碼重用,減少代碼書寫量;
b很容易修改和擴(kuò)展已有的實(shí)現(xiàn)
缺點(diǎn):a打破了封裝,因?yàn)榛愊蜃宇惐┞读藢?shí)現(xiàn)細(xì)節(jié)
b白盒重用,因?yàn)榛惖膬?nèi)部細(xì)節(jié)通常對(duì)子類是可見的
c當(dāng)父類的實(shí)現(xiàn)改變時(shí)可能要相應(yīng)的對(duì)子類做出改變
d不能在運(yùn)行時(shí)改變由父類繼承來的實(shí)現(xiàn)
2、 接口的好處?壞處?
優(yōu)點(diǎn):幫助Java語(yǔ)言實(shí)現(xiàn)一個(gè)類似于多繼承的功能.但是實(shí)現(xiàn)的多繼承功能不會(huì)使代碼中的類之間出現(xiàn)網(wǎng)狀關(guān)系,而是比較清楚的樹狀關(guān)系,類似于家譜的感覺。
缺點(diǎn):如果向一個(gè)java接口加入一個(gè)新的方法時(shí),所有實(shí)現(xiàn)這個(gè)接口的類都得編寫具體的實(shí)現(xiàn)。
3、 多態(tài)的作用?好處?壞處?
作用:簡(jiǎn)單的說就是一個(gè)接口,多種實(shí)現(xiàn);繼承的表現(xiàn)就是多態(tài)(沒有繼承就沒有多態(tài)。)
a應(yīng)用程序不必為每一個(gè)派生類編寫功能調(diào)用,只需要對(duì)抽象基類進(jìn)行處理即可。大大提高程序的可復(fù)用性。
b派生類的功能可以被基類的方法或引用變量所調(diào)用,這叫向后兼容,可以提高可擴(kuò)充性和可維護(hù)性。
優(yōu)點(diǎn):a可替換性(可以替換一存在的代碼);
b可擴(kuò)充性(增加新的子類不影響原有類的特性);
c接口性;
d靈活性;
e簡(jiǎn)化性
缺點(diǎn):a“遮蓋”私有方法。只有非private的方法才能夠被籠罩,盡管編譯器不會(huì)報(bào)錯(cuò),然而也不會(huì)遵照我們所渴望的來實(shí)行。在導(dǎo)出類中,對(duì)于基類中的private方法,優(yōu)秀采納不同的名字。
b域在轉(zhuǎn)型時(shí)候的問題。對(duì)于成員變量(域),導(dǎo)出類將占有從基類承襲而來的成員變量和自己的成員變量(變量名字相一同也是如此),況且,將分?jǐn)偛煌拇鎯?chǔ)空間,這么,導(dǎo)出類將具有兩個(gè)名目一樣的域。為了取得基類的域,務(wù)須實(shí)際地著名super.field能力走訪,而默許的域則是導(dǎo)出類自己的域。
c靜態(tài)計(jì)策是與類相關(guān)系的,而非與某個(gè)對(duì)象相干聯(lián)的,那么它就不擁有多態(tài)行動(dòng)。
4、 什么是重載?什么是重寫?
重載:
a方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。多個(gè)同名函數(shù)同時(shí)存在,具有不同的參數(shù)個(gè)數(shù)/類型。重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。
b Java的方法重載,就是在類中可以創(chuàng)建多個(gè)方法,它們具有相同的名字,但具有不同的參數(shù)和不同的定義。調(diào)用方法時(shí)通過傳遞給它們的不同參數(shù)個(gè)數(shù)和參數(shù)類型來決定具體使用哪個(gè)方法, 這就是多態(tài)性。
c重載的時(shí)候,方法名要一樣,但是參數(shù)類型和個(gè)數(shù)不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)。
重寫:
a父類與子類之間的多態(tài)性,對(duì)父類的函數(shù)進(jìn)行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時(shí)子類并不想原封不動(dòng)地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。
b若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數(shù)表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關(guān)鍵字,該關(guān)鍵字引用了當(dāng)前類的父類。
c子類函數(shù)的訪問修飾權(quán)限不能少于父類的;
5、 什么是組合?
組合: a通過創(chuàng)建一個(gè)由其他對(duì)象組合的對(duì)象來獲得新功能的重用方法
b新功能的獲得是通過調(diào)用組合對(duì)象的功能實(shí)現(xiàn)的
c有時(shí)又叫聚合
優(yōu)點(diǎn):a被包含對(duì)象通過包含他們的類來訪問
b黑盒重用,因?yàn)楸话瑢?duì)象的內(nèi)部細(xì)節(jié)是不可見的
c很好的封裝
d每個(gè)類專注于一個(gè)任務(wù)
e通過獲得和被包含對(duì)象的類型相同的對(duì)象引用,可以在運(yùn)行時(shí)動(dòng)態(tài)定義組合的方式
缺點(diǎn):a結(jié)果系統(tǒng)可能會(huì)包含更多的對(duì)象
b為了使組合時(shí)可以使用不同的對(duì)象,必須小心的定義接口
二、面向?qū)ο笤O(shè)計(jì)的六大原則:
1)Open-Close Principle(OCP),開-閉原則,講的是設(shè)計(jì)要對(duì)擴(kuò)展有好的支持,而對(duì)修改要嚴(yán)格限制。這是最重要也是最為抽象的原則,基本上我們所說的Reusable Software既是基于此原則而開發(fā)的。其他的原則也是對(duì)它的實(shí)現(xiàn)提供了路徑。
2)Liskov Substituition Principle(LSP),里氏代換原則,很嚴(yán)格的原則,規(guī)則是“子類必須能夠替換基類,否則不應(yīng)當(dāng)設(shè)計(jì)為其子類。”也就是說,子類只能去擴(kuò)展基類,而不是隱藏或覆蓋基類;
3)Dependence Inversion Principle(DIP),依賴倒換原則,“設(shè)計(jì)要依賴于抽象而不是具體化”。換句話說就是設(shè)計(jì)的時(shí)候我們要用抽象來思考,而不是一上來就開始劃分我需 要哪些哪些類,因?yàn)檫@些是具體。這樣做有什么好處呢?人的思維本身實(shí)際上就是很抽象的,我們分析問題的時(shí)候不是一下子就考慮到細(xì)節(jié),而是很抽象的將整個(gè)問題都構(gòu)思 出來,所以面向抽象設(shè)計(jì)是符合人的思維的。另外這個(gè)原則會(huì)很好的支持OCP,面向抽象的設(shè)計(jì)使我們能夠不必太多依賴于實(shí)現(xiàn),這樣擴(kuò)展就成為了可能,這個(gè)原則也是另 一篇文章《Design byContract》的基石。
4)Interface Segregation Principle(ISP),接口隔離原則,“將大的接口打散成多個(gè)小接口”,這樣做的好處很明顯。
5)Composition/Aggregation Reuse Principle(CARP),合成/聚合復(fù)用原則,設(shè)計(jì)者首先應(yīng)當(dāng)考慮復(fù)合/聚合,而不是繼承(因?yàn)樗苤庇^,第一印象就是“哦,這個(gè)就是OO 啊”)。這個(gè)就是所謂的“Favor Composition over Inheritance”,在實(shí)踐中復(fù)合/聚合會(huì)帶來比繼承更大的利益,所以要優(yōu)先考慮。
6)Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法則或最少知識(shí)原則,這個(gè)原則首次在Demeter系統(tǒng)中得到 正式運(yùn)用,所以定義為迪米特法則。它講 的是“一個(gè)對(duì)象應(yīng)當(dāng)盡可能少的去了解其他對(duì)象”。也就是又一個(gè)關(guān)于如何松耦合(Loosely-Coupled)的法則。
總結(jié)
以上是生活随笔為你收集整理的Java中继承、接口、多态的作用详解(纯理论)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java关键字final、static、
- 下一篇: Java异常处理及异常机制介绍