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)是提供物件所能描述真實環境的參數,可以由基本資料型態(如 int、float、char、array...等)、或其他物件所組成。依照變數可被存取的屬性區分為: (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 程式設計(二) 含物件導向
翻轉電子書系列:
|