Java 程式設計()  第 七章 類別與物件產生      下一頁

 

第七章  類別與物件產生

7-1 物件導向設計理念

內容:

7-1-1 軟體 IC – 物件

利用物件變數來描述真實環境,可能會超出原來環境的事實而不知曉。在許多情況下,所描述的真實現象需要有相當的限制,才不會超出原來的意義。譬如,真實環境會有下列限制:

(1) 日期限制:所表示的日期應該是 1 ~ 12 月,每月至多 31 天;如果某一表示日期的變數超出這個範圍,應該被拒絕才對。

(2) 身材限制:一般人的身高大多不會超過 3 公尺,體重也大多不會超過 300 公斤,如果超過這個範圍也應該被拒絕才對。

(3) 薪資限制:依照勞委會規定,勞工薪資應該不可以低於最低薪資,如果過低的話,應該拒絕才對。

(4) 年齡限制:一般『人』的年齡應該不會有負數,或則低於 150 歲,如果超過這個範圍,也應該拒絕才對。

當我們利用某些變數去描述上述現象時,希望能具有上述限制的功能。也就是說,描述真實環境的變數,本身需要有判斷處理的功能,當所描述的環境因素超過了真實現象,必須主動拒絕。

在許多情況下,僅拒絕不合理的變數產生,並不一定能滿足現實環境的需求,可能需要變數能自我調整,並使其合理化才是正當的做法。由上述的需求可以看出,變數不再僅是某一記憶體空間的內容,也不僅被動的填入某一數值內容就能滿足,它必須具有適當的處理能力。

如此一來,描述環境的變數則成為處理單元(Process),它是一個堅固的個體,裡面包含著適當的記憶體(變數)與程式(方法),並且針對某一種特殊功能而製作,我們就將它稱為『物件』(Object)。利用物件所描述真實環境,與編寫程式的技巧,則稱為『物件導向』(Object-oriented)。

當物件被產生之後,就擁有自己的獨立運作記憶體空間,與產生物件的主程式記憶體空間並不相衝突。由前文可知,物件是能提供某一種特殊功能的獨立個體,類似組合電子電路的『積體電路晶片』(IC)。我們也可以取得現有的物件個體,組成一套系統功能較強的軟體套件,因此,吾人將物件個體稱之為『軟體 IC』。硬體方面的 IC 晶片可被組合一個較大、功能較強的電路板,當需要更複雜設備時,又可以組合多個電路板,成為一套功能更強的資訊設備。同樣的,軟體 IC 的物件個體也同樣具有這些功能;我們組合多個物件個體,成為一套功能較強的軟體套件,但基本上他還是具有物件個體的特質。我們還是可以組合多個物件導向的軟體套件,成為另一套功能更強的軟體系統。更重要一點,這些軟體 IC 並不需要自行開發,可多人共同開發,或經由購買專屬套件取得。簡單的說,利用物件導向技術所開發出來的物件個體,它可以像 IC 晶片般的流通。當然啦!物件個體還有繼承性與多形性特質,我們於第九章再來討論。

7-1-2 物件的成員

簡單的說,物件即是活動式(Activity)描述真實環境的個體,為了使它具有主動式功能,物件個體內必須具有相當的處理能力。圖 7-1 為物件個體(Object body)內容的抽象圖,包含有:

(1) 變數成員:描述物件所欲表示的現象,可能是有形、無形、真實或虛擬事件。

(2) 方法成員:基本上,變數成員並不能直接被存取,必須透過方法成員來存取,否則會破壞變數成員的完整性。

(3) 動態記憶體空間:當物件被執行時,可能需要的某些動態記憶體,當作區域變數使用。為了讓它能獨立運作,不可以與其他執行中的程式相衝突,必須特別給予保護。

7-1 物件個體的內容

7-1-3 變數成員的屬性

變數成員(Variable member)是提供物件所能描述真實環境的參數,可以由基本資料型態(如 intfloatchararray...等)、或其他物件所組成。依照變數可被存取的屬性區分為:

(1) 隱藏性變數(private 屬性):此型變數僅允許物件內的方法成員存取,不允許外部程式擷取其內容。

(2) 公開性變數(public 屬性):允許物件內或外部程式存取其內容。

(3) 共用性變數(static 屬性):此類型變數不因物件產生而改變其內容。具有靜態變數的類別,產生多個物件後,還是使用同樣的靜態變數,又稱為『類別變數』。

7-2 表示某一類別或物件執行當中可能出現的現象,假設某一類別導入(import)另一個類別,並由新類別產生另一個物件(object_1)。新的物件裡有 3 個變數成員,其中 v1 v3 成員為隱藏性變數(private);外部程式無法直接存取,必須呼叫該物件的方法成員(method_1() method()),透過它們存取 v1 v3 內容。另外,v2 是屬於公開性變數(非隱藏性),物件外程式可以直存取其內容。

7-2 變數成員的屬性

雖然物件所提供的特殊功能,大多是利用方法成員來實現。但隱藏性變數一定需透過某些方法成員,才可以外界溝通,因此稱提供此功能的方法為『物件輸出/輸入埠口』(如圖 7-1 所示)。物件方法提供填入物件變數內容功能者,稱之為『輸入埠口』;反之,提供攫取變數內容的方法,則稱之為『輸出埠口』。

7-1-4 方法成員的屬性

方法成員(Method member) 是物件個體內的函數,可執行某一特定功能的程式。最基本的功能是提供變數成員的輸入與輸出介面,亦可區分為:

(1) 公開性方法(public 屬性):此類型的方法可任被所屬物件內或外部呼叫。

(2) 私有性方法(private 屬性):僅允許所屬物件內其他方法呼叫。

(3) 保護性方法(protected 屬性):允許所屬物件或原類別衍生出來物件的方法呼叫。

7-3 方法成員的屬性

吾人以圖 7-3 來說明方法成員的屬性如何。假設某一執行中的類別經由某一類別產生了兩個物件(object_1 object_2),外部方法(external method)可以直接呼叫執行物件內的公開性方法(public method),但無法呼叫私有性與保護性方法。然而私有性法(private method)可以被相同物件內的其他方法呼叫;保護性方法(protected method 可以被由相同類別產生物件內的方法呼叫。

7-1-5 類別與物件的關聯

簡單的說,類別(Class)就是物件的藍圖,或稱為描述檔。我們利用類別描述所期望建立物件的內容,需要時再利用類別產生物件(new 的功能)。就好像蓋房子一樣,類別即是設計房子的藍圖,利用此藍圖經由實地建造之後,便完成所設計的房子,該房子即是物件的意思。一份建築藍圖可以多次使用,蓋出許多相同樣子的房子;也就是說,一只類別可以產生多個名稱不同但功能相同的物件(如圖 7-4 所示)。

一份建築藍圖可經由增減功能成另一份建築藍圖,再利用新的建築藍圖去蓋另一種房屋;同樣的道理,一份類別可經由增加或修改功能成另一個新的類別,再利用新類別去產生另一種不同型態的物件,這就是類別的繼承性。

但建築圖與類別之間還是稍有不同,建築圖必須經過施工建設才能完成一間房屋才能居住;類別則不然,它不一定需要經過建設產生(new() 操作)才能使用,許多地方可以導入類別並直接執行,這方面本書預留在第九章介紹。本章僅介紹需經由類別產生物件後才可以執行。

7-4 類別與物件的關聯

 

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: