面向對象和面向過程的區別
- 出發點不同。
面向對象強調問題域的要領直接映射到對象和對象之間的接口上,是用符合常規思維的方式來處理客觀世界的問題。
面向過程方法強調的則是過程的抽象化和模塊化,是以過程為中心構造或處理客觀世界問題的。 - 層次邏輯關系不同。
面向對象方法以對象的集合類作為處理問題的基本單位。面向對象方法是用類的層次結構來體現類之間的繼承和發展。用計算機邏輯來模擬現實世界中的物理存在。
面向過程方法處理問題的基本單位是能清晰準確地表達過程的模塊,用模塊的層次結構概括模塊或模塊間的關系與功能,把客觀世界的問題抽象成計算機可以處理的過程。 - 數據處理方式和控制程序方式不同。
面向對象方法將數據與對應的代碼封裝成一個整體,對象的修改只能由自身的成員函數完成,控制程序方式上是通過“事件驅動”來激活和運行程序。
面向過程方法是直接通過程序來處理數據,處理完畢后可顯示數據結果,在控制程序方式上是按照設計調用或返回程序,各模塊之間存在者控制與被控制、調用與被調用的關系。 - 分析設計與編碼轉換方式不同。
面向對象方法貫穿于軟件生命周期的分析、設計及編碼中,是一種平滑過程,從分析到設計再到編碼是采用一致性的模型表示,即實現的是一種無縫的連接。
面向過程方法強調分析、設計及編碼之間按規則進行轉換,貫穿于軟件生命周期的分析、設計及編碼中,實現的是一種有縫的連接。
舉一個對象和過程的例子。
人:人的身高體重性別年齡,會直立行走會讀書吃飯。
電腦開機的過程。
面向對象的特征
抽象、繼承、封裝、多態。
組合和繼承的區別
組合和繼承都是面向對象中代碼復用的方式。
組合是指在新類里面創建原有類的對象,重復利用已有類的功能。
繼承是面向對象的主要特性之一,可以根據類的實現來定義一個類的實現。
組合和繼承都允許在新的類中設置子對象,只是組合是顯式的,繼承則是飲食的。
組合和繼承存在著對應關系:組合中的整體類和繼承中的子類嘴硬,組合中的局部類和繼承中的父類對應。
二者的區別通過分析一個實例來說明:Car表示汽車對象,Vehicle表示交通工具對象,Tire表示輪胎對象。Car是Vehicle的一種,是繼承(is-a關系);而Car包含了多個Tire,因此是一種組合關系(has-a關系)。
寫代碼的時候,選擇原則:
(1)除非是“is-a”的關系,否則不要輕易選擇繼承,因為過多地使用繼承會破壞代碼的可維護性,當父類被修改時,會影響所有繼承它的子類,從而增加程序的維護難度與成本。
(2)如果類沒有“is-a”的關系,可以通過實現接口與組合的方式來達到相同的目的,采用接口與組合的方式具有更好的可擴展性。
由于Java語言只支持單繼承,如果想同時繼承兩個類或多個類,在Java 中是無法直接實現的。同時,如果繼承太多,在一個class里會顯得臃腫不堪。所以,能用組合就盡量不要用繼承。
多態
同一個操作,在不同的對象時,會有不同的意義,產生不同的效果。
例如,同樣是“+”的操作,“3+4”用來實現整數相加,“3”+“4”用來實現字符串連接。
多態有兩種表現形式:
- 方法的重載,是一種編譯時多態。重載是同一個類中可能有多種同名的方法,在編譯時可能會選擇不同的方法。重載可看成一個類中方法的多態性。
- 方法的覆蓋,是一種運行時多態。子類可以覆蓋父類的方法,同樣的方法在子類和父類中有不同的表現形式