面向對象程序設計是目前主流的程序設計泛型,它取代了20世紀70年代的“結構化”編程和過程化編程。
面向對象程序由對象組成。每個對象包含對用戶的特定功能部分和隱藏的實現部分。
程序中很多對象來自標准庫,還有一些是自定義的。從根本上來說,只要對象能滿足需求,就不用關心它是怎么來的。
程序側重點的不同
傳統的結構化程序設計通過設計一系列的過程(即算法)來求解問題。
即算法是第一位的,數據結構是第二位的,程序員首先要決定如何操作數據,之后再決定如何組織數據。
而面向對象程序設計是以數據結構的構成作為核心。
程序員要先組織數據,之后再決定如何操作數據。
面向對象更加適合解決規模較大的問題。
面向對象的最底層也是面向過程,只不過它對過程進行了抽象
類
類的概述
類是構造對象的模板或藍圖
由類構造對象的過程稱為創建類的實例。
Java標准庫
標准Java庫中提供了幾千個類,可以用於各種目的。盡管如此,在Java中還是需要自己創建一些類,一邊描述你的應用程序所對應的問題領域中的對象。
封裝概念
封裝(有時候成為數據隱藏)是處理對象的一個重要概念。
從形式上看,封裝就是將數據和行為組織在一個包里,並對對象的使用者隱藏具體的實現方式。
實例字段與方法
對象中的數據稱為實例字段,操作數據的過程成為方法,特定對象都有一組特定的實例字段值。這些值的集合就是這個對象的當前狀態。
無論何時,只要再對象上調用方法,它的狀態就可能改變
封裝實現的關鍵
實現封裝的關鍵在於,絕對不能讓類中的方法直接訪問其他類的實例字段。
程序只能通過對象的方法與對象數據進行交互。
封裝給予了對象“黑盒”的特征。這是提高重用性和可靠性的關鍵
意味着:一個類可以完全概念存儲數據的方式,只要仍然使用同樣的方法操作數據,其對象就不會知道也不用關心這個類所發生的變化
繼承概念
Java中可以通過擴展其他類,來構建新的類。
事實上Java中所有的類都擴展自Object類。
這個被擴展后的新類,具有被擴展的類的全部屬性和方法。
只要在新類中提供適合這個新類的方法和字段就可以了。
這種通過擴展=來建立另一個類的方式,被稱為繼承
對象
對象的三個主要特性
-
對象的行為——可以對對象完成哪些操作,或者可以對對象應用哪些方法。
-
對象的狀態——當掉用那些方法時,對象會如何響應?
-
對象的標識——如何區分具有相同行為與狀態的不同對象?
對象的基本概念
同一個類的所有對象實例,由於支持相同的行為而具有家族式的相似性。對象的行為是用可調用的方法來定義的。
每個對象都保存着描述當前狀況的信息。這就是對象的狀態。
對象狀態的改變,必須通過調用方法實現。
對象的狀態並不能完全描述一個對象,每個對象都有一個唯一的標識(id
)
作為同一個類的實例,每個對象的標識總是不同的,狀態往往也存在着差異。
對象的這些關鍵特性會彼此相互影響。
識別類
傳統的函數式編程中,總是從main方法開始,而OOP則應該從識別類開始,之后再對類添加各種方法。
面向對象編程的開始
識別類的一個簡單經驗是在分析問題的過程中尋找名詞,而方法對應着動詞。
當然,這種“名詞與動詞”原則只是一種經驗,在創建類的時候,只有經驗才能幫助你確定哪些名詞和動詞重要。
類之間的關系
類之間最常見的關系有:
-
依賴
-
集合
-
繼承
依賴
依賴,即uses-a
關系,是一種最明顯的、最常見的額關系。
如果一個類,使用另一個類的方法,或操作另一個類的對象,我們就說你,這個類依賴於另一個類。
應該盡可能地將相互依賴的類減至最少。
關鍵是,如果類A不知道B的存在,它就不會關系B怎么改變。
用軟件工程的數據來說,就是要降低耦合度
聚合
聚合,即has-a
關系,很容易理解。
如果一個類對象中包含着另一個類的對象,我們就說他們聚合在一些。
例如:公司類對象包含着一些員工類對象一樣
繼承
繼承,即is-a
關系,表示一個更特殊的類與一個更一般的類之間的關系。
如果類A擴展類B,那我們就說,類A繼承類B。
一般而言,類A在繼承類B的同時,會增加一些額外的功能。