1. 程式人生 > >面向物件的三大特徵及其作用

面向物件的三大特徵及其作用

面向物件程式設計 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。

通過繼承建立的新類稱為“子類”或“派生類”。

被繼承的類稱為“基類”、“父類”或“超類”。

繼承的過程,就是從一般到特殊的過程。

要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。

在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。

繼承概念的實現方式有三類:實現繼承、介面繼承和可視繼承。

Ø         實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;

Ø         介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;

Ø         可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現程式碼的能力。

在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關係應該是“屬於”關係。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因為腿並不是一個人。

抽象類僅定義將由子類建立的一般屬性和方法,建立抽象類時,請使用關鍵字 Interface 而不是 Class。

OO開發正規化大致為:劃分物件→抽象類→將類組織成為層次化結構(繼承和合成) →用類與例項進行設計和實現幾個階段。

多型:

多型(Polymorphism):用我們通俗易懂的話來說就是子類就是父類(貓是動物,學生也是人),因此多型的意思就是:父型別的引用可以指向子類的物件。

方法的重寫、過載與動態連線構成多型性。Java之所以引入多型的概念,原因之一是它在類的繼承問題上和C++不同,後者允許多繼承,這確實給其帶來的非常強大的功能,但是複雜的繼承關係也給C++開發者帶來了更大的麻煩,為了規避風險,Java只 允許單繼承,派生類與基類間有IS-A的關係(即”is a “動物)。這樣做雖然保證了繼承關係的簡單明瞭,但是勢必在功能上有很大的限制,所以,Java引入了多型性的概念以彌補這點的不足,此外,抽象類和接 口也是解決單繼承規定限制的重要手段。同時,多型也是面向物件程式設計的精髓所在。 

在一個類中,可以定義多個同名的方法,只要確定它們的引數個數和型別不同,這種現象稱為類的多型。類的多型性體現在兩方面:一是方法的過載上,包括成員方法和構造方法的過載;二是在繼承過程中,方法的重寫。

多型性是面向物件的重要特徵。方法過載和方法覆寫實際上屬於多型性的一種體現,真正的多型性還包括物件多型性的概念。

物件多型性主要是指子類和父類物件的相互轉換關係。

a) 向上型別轉換(upcast):比如說將Cat型別轉換為Animal型別,即將子型別轉換為父型別。對於向上型別轉換,不需要顯式指定。

b) 向下型別轉換(downcast):比如將Animal型別轉換為Cat型別。即將父型別轉換為子型別。對於向下型別轉換,必須要顯式指定(必須要使用強制型別轉換)。

網上摘抄的一段多型小總結:


1. Java
中除了staticfinal方法外,其他所有的方法都是執行時繫結的。在我另外一篇文 章中說到private方法都被隱式指定為final的,因此final的方法不會在執行時繫結。當在派生類中重寫基類中staticfinal、或 private方法時,實質上是建立了一個新的方法。
2.
在派生類中,對於基類中的private方法,最好採用不同的名字。
3.
包含抽象方法的類叫做抽象類。注意定義裡面包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的介面。
4.
物件清理的順序和建立的順序相反,當然前提是自己想手動清理物件,因為大家都知道Java垃圾回收器。
5.
在基類的構造方法中小心呼叫基類中被重寫的方法,這裡涉及到物件初始化順序。
6.
構造方法是被隱式宣告為static方法。
7.
用繼承表達行為間的差異,用欄位表達狀態上的變化。