1. 程式人生 > >Java中繼承、介面、多型的作用詳解(純理論)

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)的法則。