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