Java面向對象之所以能夠成為主流,那是因為人習慣以對象的方式認識現實世界,例如我說:老虎。那你大腦中馬上呈現出一個老虎的樣子,對吧。
軟件存在的意義就是為了解決現實世界當中的問題,它必然模擬現實世界,也就是說現實世界中有什么,軟件中就對應有什么。
Java面向對象編程思想中關注點是“對象”或者“事物”,那么在編程語言當中要想創建對象則必須先有類,那么類和對象分別是什么,它們的區別和聯系是什么呢?
類是現實世界當中具有共同特征的事物進行抽象形成的模板或概念。而對象是實際存在的個體。例如:“汽車”就是一個類(所有的汽車都有方向盤、發動機、都能形式,這是它們的共同特征),“你家的那個汽車”就是一個真實存在的對象。或者說“明星”是一個類,“劉德華”就是一個對象。“沈騰”、“趙本山”、“宋丹丹”都是實際存在的對象,他們都屬于“笑星”類,類描述事物的共同特征,那么“笑星”類都有哪些共同特征呢?笑星類都有姓名、性別、年齡等狀態信息(屬性),他們還有一個共同的行為就是“演出”(方法)。但當具體到某個對象上之后,我們發現姓名是不同的,性別是不同的,年齡也是不同的,演出的效果也是不同的。所以我們在訪問姓名、性別、年齡的時候,必須先有笑星對象,通過真實存在的笑星對象去訪問他的屬性,包括“演出”的時候,只有“笑星”類是不行的,必須先有笑星對象,讓笑星對象去執行“演出”這個動作。
通過類可以創建對象,對象又被稱為實例(instance),這個過程也可以稱為實例化。對象1、2、3具有共同特征,進行抽象形成了類,所以從對象到類稱為抽象。如下圖所示:
圖8-1:類和對象
通過以上的描述,我們得知:類 = 屬性 + 方法,而屬性描述的是狀態,方法描述的是行為動作。行為動作以方法的形式存在,那屬性以什么形式存在呢?例如:姓名、性別、年齡,大家想起之前學習的變量了嗎?變量用來存儲數據。不錯,對象的屬性以變量形式存在,并且這里所說的變量是我們之前提過的“成員變量當中的實例變量”。為什么是實例變量呢,實例變量就是對象級別的變量,這樣的變量要求必須先存在對象,通過對象才能訪問。例如:“中國人”這個類,有一個屬性是“身份證號”,每一個中國人的“身份證號”都是不一樣的,所以身份證號必須使用一個真實存在的“中國人對象”來訪問。不能使用“中國人”這個類去訪問身份證號。一個類可以實例化N多個對象,假設通過“中國人”這個類創建了100個“中國人對象”,那么“身份證號”必然會有100個實例變量空間去存儲。