這篇企圖以Java來說明什麼是物件導向程式。

我記得第一次看到物件導向是在一本VBA教學的書中看到的,那時候會買這本書是想精進Excel的能力,因為聽說巨集很厲害,似乎跟VBA有關,就跑到書店買了本VBA教學的書,不過這本書最後也沒看完,只記得看到物件導向介紹那裡就放棄了,因為不知道在講啥。

而我是在資策會課程結束前一個月,在製作專題時才逐漸了解什麼是物件導向程式,什麼是類別,什麼是物件等觀念。

在開始學習Java的初期只知道要這樣寫可達到某種效果,但卻不知道為什麼要這樣寫,也不知道這樣寫就是在寫物件導向程式,所以若是您已經學習Java一陣子了,但對物件導向還是沒個概念,別氣餒,隨著經驗的累積你會逐漸豁然開朗的。

 

在說明物件導向程式以前,先說明什麼是程式。

程式就是一連串的指令敘述,其用來指揮機器(電腦)要做什麼。

以大家常用的Line為例,Line是手機應用程式,而其中又包含許多小的程式來達到某些功能,例如發送訊息,當您在Line的輸入框輸入好文字並按確定後,Line裡面就會有個程式開始運作,其指令可能包括以下步驟...

  1. 接收文字訊息,
  2. 將文字訊息送到Line的伺服器,
  3. 紀錄發送文字的時間,
  4. 將文字訊息傳送至朋友的手機

 

傳統的程式語言例如C語言,程式是由許多函式(Function)所構成,例如以上四個步驟可能就是代表四個函式依序執行。

而物件導向程式如Java,程式是由各種類別(Class)所構成,程式設計師透過類別所產生的物件(Objects)來執行各種操作的編排...。

如果你是剛開始接觸程式的初學者,看不懂上面那句話很正常,程式這種東西,往往都要有點實際的使用經驗才知道書上講的意思,但弔詭的是,若不懂是要怎麼使用呢? 這就是學習程式奇妙的地方,我認為初學程式的時候不要求甚解,否則很快就會發瘋沮喪放棄,剛開始只要"會用"就好。例如我們知道Line可以和朋友傳訊息聊天,我們只要知道怎麼輸入文字並傳送就夠了,即使不知道Line是怎麼運作一樣可以傳訊息,學程式也是一樣。例如剛開始學Java都會從System.out.println("Hello World");開始,你可能會想,為什麼要打System.out.println()?,System代表什麼?那個.又是什麼,out是什麼?println()是什麼等一堆疑惑? 有這些疑或很正常,但建議剛初學的你先將這些問題擱一旁,此時只要知道System.out.println("Hello World");會在console印出Hello World這幾個字就夠了。

回到主題,你可能會問,你剛說的類別是什麼東西? 什麼實例化什麼鬼的又是什麼? 容我在以下說明...。

在Java中,類別(Class)是一種類似規格書的東西(有些書會比喻成藍圖(blueprint)),類別用來定義一個物件(Object)擁有哪些特性(properties)行為(methods)

舉個實際的例子,例如我想寫個賽車遊戲的程式,那通常會有賽車,賽道,選手等要素(當然還有很多其他要素)。假設以物件導向來設計的話,首先必須建立一個賽車類別,所以我們可建立一個Car.java(類別可任意命名,例如也可改成RacingCar.java),而我希望賽車可以更換顏色(color),品牌(brand)及速度(speed)等特性,以及加速(accelerate),煞車(brake)等行為,所以我必須在Car.java去定義這些特性與行為如下...

Car.java

...

上面的Car.java就是一個完整而簡單的Java類別,我們透過撰寫這個類別來定義我們想要的賽車的特性(properties)及行為(methods)(在Java中我們通常把method稱作方法)。

但注意這個時候程式中只有類別而已,並沒有物件。在Java中,物件必須藉由一個定義好的類別來產生,在Java中建立物件的語法為

類別名稱 物件名稱 = new 類別名稱();

...

當然不可能像上面一樣打中文啦,那只是用來說明而已。

例如我們想要建立一個Car.java類別的物件,則在程式中撰寫如下

Car car1 = new Car();

...

new為Java的關鍵字,用途為用來建立一個新物件,這邊的car1即為一個以Car類別所產生的物件。上面那一段建立物件的程式片段,若以文字來描述為:

"建立一個Car類別的物件,並將該物件給與一個參考名稱叫car1"

 

令初學者痛苦混淆的地方到了,此時您可能還是分不清楚類別和物件的區別,所以在這我必須另外多舉個例子來說明...。

以現實世界的概念來看,我是個人(Human),你也是個人,隔壁的老王也是個人,此時你會認為你,我及老王是相同的嗎? 在回答問題之前,我們先必須知道我們是站在什麼角度回答,如果我們是以個體的角度來看,則你,我及老王當然是不同的,因為你可能叫小明,我叫肉豬,他叫老王,此外我們年齡,身高也都不一樣,所以答案是不相同。但若我們改以人類(Human)這樣更高的角度來看,我們都同樣是屬於人類這個類別,我們是相同的,因為我們擁有屬於人類的共同特性。

回到物件導向來看,人類就是一種類別的概念,但"人類"並不代表某個特定的人,而是所有人所抽象出來的概念,而老王則代表特定的一個人類,他就是人類這個類別的一個物件,你和我也都是人類類別的物件,所以人類是類別,你,我,老王是物件。而因為我們都屬於人類這個類別的物件,也因此我們都具有相同的特性與行為(方法)。而其他類別,例如鳥類別,就和我們有不同的特性與方法,例如鳥類別的行為有"飛(fly)"及羽毛(feather),但人類沒有。

若一個類別被實例化(instantiate),代表建立一個該類別的物件(Object),所以在Java中實例(instant)和物件(Object)指的是相同的東西。而所謂實例化,就是以某類別建立一個該類別的物件的意思,也就是上面的new Car();

 

若看了以上解釋還很模糊是很正常的,只要多寫點程式有一天必定能參透其中的觀念。

 

最後解釋一下抽象(abstraction)這個詞,相信大家學習物件導向程式的時候一定常在書中或課堂上接觸過這個詞,抽象的意義我也是資策會快結業前才了解其意思,因為抽象這個詞本身就挺抽象了:p。抽象這兩個字剛開始我直接聯想到的是畢卡索的畫,也就是他畫通常都很...不知道在畫什麼?直到後來了解抽象的意思後才了解何以他的畫被稱做抽象畫。

在維基百科上對於抽象的解釋如下

---

抽象化(英語:Abstraction)是指以縮減一個概念或是一個現象的資訊含量來將其廣義化(Generalization)的過程,主要是為了只保存和一特定目的有關的資訊。例如,將一個皮製的足球抽象化成一個球,只保留一般球的屬性和行為等資訊。相似地,亦可以將快樂抽象化成一種情緒,以減少其在情緒中所含的資訊量。

---

另一篇(計算機科學)的解釋為

---

在電腦科學中,抽象化(英語:Abstraction)是將資料與程式,以它的語意來呈現出它的外觀,但是隱藏起它的實作細節。抽象化是用來減少程式的複雜度,使得程式設計師可以專注在處理少數重要的部份。一個電腦系統可以分割成幾個抽象層(Abstraction layer),使得程式設計師可以將它們分開處理。

---

看到這邊應該覺得有點莫名其妙,明明寫得是中文但不知道為什麼就是看不懂,寫得實在是太"抽象"了。

若要了解抽象的意義,應與它的相對詞具體(concrete)一起來比較才容易了解。

例如你與你的哥們兒在逛街,你撇見一名正妹擦肩而過,基於與好朋友分享的心態,你驚呼:"快看,正妹!!",但可惜為時已晚,你哥們回頭看時只看到一堆人的背影,便問:"哪個正妹阿?",你舉起手,指著逐漸遠去的正妹背影說:"就那個阿,超正的!",你哥們說:"靠!!你這樣比我哪知道,到底哪個是正妹?可不可以具體一點?",你說:"就那個綁馬尾,穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲搭粉色Timberland工作靴的那個阿!",你哥們聽到你這樣描述後,馬上往你描述的正妹方向衝去,若無其事偷偷回頭撇了一眼,然後跑回來跟你說:"幹!真的超正的,奶又大",然後你們彼此賊賊地笑了起來...。

從上面的情境中,各位分得出何謂具體,何謂抽象呢?

在例子中,"正妹"是抽象,"穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲搭粉色Timberland工作靴的那個(女生)"是具體,而"正妹"是一個抽象概念,只要是年輕美麗具有性吸引力的女性都可稱之。正妹不一定要穿黑絲,但放眼望去無數背影,各個似乎都是正妹,若要分別每一位正妹,則要給予每個正妹其具體的特色,例如髮型,身材,穿著,身高等,經過給予這些特色,就成了個具體的正妹了,所以這個"綁馬尾,穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲搭粉色Timberland工作靴的那個(女生)"就不再同於旁邊的"大波浪捲,著鵝黃色小洋裝,搭白色涼鞋的正妹",但我們可以用"正妹"來形容這兩個女生,因為她們具有一個共同的抽象概念,也就是"年輕美麗具有性吸引力的女性",有了"正妹"這個詞,我們從此可以涵蓋更多不同打扮的漂亮妹妹了。

上面這例子可能舉得不太好,再舉個比較簡單的例子,

汽車對於Benz C300或Mazda 6,則汽車是抽象的,Benz C300和Mazda 6是具體的。

交通工具對於飛機或汽車,交通工具是抽象的,飛機或汽車是具體的,

所以抽象或具體,要把相對性納入考慮,看是拿什麼比什麼。而一個抽象的東西,或許還可以再從中抽出更抽象的東西。

再這邊同時也可呼應上面關於類別的說明,類別(正妹)就是抽象的概念,而物件(綁馬尾,穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲搭粉色Timberland工作靴的女生)就是一個具體,而類別(正妹)本身再抽象化,就是介面(Interface)了,這介面可以是"女人","年輕"或"漂亮"。

希望以上能幫助各位了解Java物件導向的概念。

 

文章標籤
創作者介紹

菲比傻大姐&肉豬

phoebelin0606 發表在 痞客邦 PIXNET 留言(3) 人氣()


留言列表 (3)

發表留言
  • 李奕德
  • 學長您好喔! 我是近期即將開課Java班的學員,大學是私立商學院畢業的學生,目前有先看了一些書,有一些基本的概念,但因為目前所學太淺,也不知理解正不正確!

    我對於書上內容的理解如下:如果將汽車視為物件,我們在有汽車駕駛之前,必須有人先設計出汽車的工程圖,而工程圖中也包含油門與煞車等設計,這些設計會隱藏其中複雜的運作機制,讓使用者在一無所知的情況下也可以開車。

    類別在概念上類似於汽車的工程圖,方法包括了油門與煞車的設計等等...

    關於抽象化,抽象化可以讓我們忽略汽車內部複雜的運作機制,而可以輕鬆的當作一項工具來應用,而油門與煞車系統也是另一種較低層級抽象化,我們也同樣可以依忽略其運作機制直接使用!

    這是我目前簡易的理解,也不確定是否正確,請前輩多多指教
  • 你理解的很正確呀!

    phoebelin0606 於 2016/04/08 20:06 回覆

  • 過客
  • 爬文這麼久總算找到正確的物件導向概念了 網路上一堆半吊子都亂比喻(設計圖->房子,秘笈->武功等眾多版本...)誤導不少人 感謝妳的這篇文章糾正錯誤
  • GUEST
  • 正妹那段好好笑
找更多相關文章與討論