簡單地說,類是對象的藍圖。當你執行個體化一個對象時,你基于類來建構這個對象。事實上,嘗試解釋類和對象實際上是一個先有雞還是先有蛋的問題。描述類時不使用術語對象是非常困難的,反之亦然。例如,個人自行車是一個對象。然而,有人已經建立了藍圖(就是類)來建造這個自行車。在面向對象的軟體中,對比先有雞還是先有蛋的問題的不同之處在于,我們知道對象和類哪個先出現(類先出現)。如果沒有類,對象無法被執行個體化。是以本節很多概念與本章之前的很多内容都很相似,特别是我們讨論屬性和方法時。
為了解釋類和方法,我們可以拿關系型資料庫來舉例。在資料表中,表自身的定義(即字段、描述和資料類型)是類(即中繼資料),而對象則是表中的行(即資料)。
本書關注于面向對象的軟體開發,但不局限于具體的語言實作(比如java、c#、visual basic .net、objective c或者c++)。但經常使用代碼示例可以幫助大家了解,是以必要時我會在本書中使用java代碼來幫助解釋一些概念。而且每章的結尾會包含本章代碼示例的c#版。在出版社網站可以擷取到本書中出現的大部分代碼。我們也在網上提供了java、c# .net、vb .net和objective c版本的示例代碼。
接下來的小節會描述類的一些基本概念,以及它們之間的關系。
類可以認為是對象的模闆或者模具,正如圖1-10中的餅幹模具一樣。類用來建立對象。

類可以認為是一種更進階别的資料類型。例如,你建立了一個整數或浮點數:
你也可以使用預先定義的類建立一個對象:
本例中,通過名稱可以明顯看出myclass是類,而myobject是對象。
請記住每個對象有自己的屬性(資料)和行為(函數或慣例)。類定義了使用該類建立的所有對象具有的屬性和行為。類是一塊代碼。可以單獨分發使用類執行個體化的對象,也可以将類作為程式庫的一部分進行分發。因為對象從類中建立,是以類必須定義對象的基礎材料(即屬性、行為和消息)。總之,在建立對象之前必須先設計一個類。
例如,以下是對person類的定義:
正如你看到的一樣,類的資料通過屬性來表示。每個類必須定義屬性,用來存放該類執行個體化的每個對象的狀态。在上一小節中的person類的例子中,person類定義了name和address兩個屬性。
通路控制
當資料類型或方法被定義為public時,其他對象可以直接通路它。當資料類型或方法被定義為private時,隻有自身對象可以通路它。另一個通路修飾符protected隻允許相關對象通路,第3章會講述該點。
正如你本章之前學到的一樣,方法實作了一個類需要的行為。從某個類執行個體化的每個對象都擁有該類中定義的方法。有些方法可以調用其他對象(或資訊)的行為,而有些方法則提供該類底層的内部行為。内部行為是私有方法,不允許其他對象通路。在person類中,行為有getname()、setname()、getaddress()、setaddress()。其他對象可以通過這些方法檢查或修改該對象屬性值。這是面向對象的系統中常用的技術。在任何情況下,對對象中屬性的通路應該由該對象自身控制,任何一個對象都不應該直接修改其他對象的屬性。
消息是對象之間的通信機制。例如,當對象a調用了對象b的一個方法,對象a向對象b發送了一個消息。對象b的響應由其傳回值定義。其他對象隻能調用一個對象的公共方法,而無法調用其私有方法。以下代碼驗證了該點:
在該例子中(假設payroll對象已經