網頁

2017/10/24

Java 物件導向的概念

什麼是物件導向呢?物件導向的英文是Object-oriented Programming,又簡稱OO或OOP,中國用語是面向对象。


前言

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

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

在說明物件導向程式以前先說明什麼是程式。程式就是一連串的指令敘述,其用來指揮機器(電腦)要做什麼。

以LINE手機應用程式(app)為例,其由許多程式來達到某些功能,例如發送訊息。當在LINE輸入好文字並按確定後,LINE裡面就會有個程式開始運作,可能包括以下步驟...

  1. 接收輸入文字訊息。
  2. 將文字訊息送到LINE的伺服器。
  3. 紀錄發送文字的時間。
  4. 將文字訊息傳送至對方的手機。

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

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

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



類別與物件

回到主題,你可能會問類別是什麼東西?實例化又是什麼?請看以下說明...。

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

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

public class Car {

    /** 顏色屬性 */
    String color;
    /** 品牌屬性 */
    String brand;
    /** 速度屬性 */
    int speed;

    /** 加速方法 */
    void accelerate(){
        this.speed++; // 加速(速度+1)
    }

    /** 煞車方法 */
    void brake(){
        this.speed--; // 煞車(速度-1)
    }

}

上面的Car.java就是一個完整而簡單的Java類別,我們透過撰寫這個類別來定義我們想要的賽車的特性(properties)及行為(methods)(method又稱作方法)。 注意此時程式中只有類別而已,並沒有物件。在Java中,物件必須由定義好的類別來產生,在Java中建立物件的語法為:

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

當然實務中不會像上面一樣打中文,這只是用來說明而已。

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

Car car1 = new Car();

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

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

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

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

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

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

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



抽象

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


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

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

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

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

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

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


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

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

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


上面這例子可能舉得不太好,再舉個比較簡單的例子。汽車對於Benz C300Mazda 6汽車是抽象的,而Benz C300Mazda 6是具體的。交通工具對於飛機汽車交通工具是抽象的,飛機汽車是具體的,

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

呼應之前關於類別的說明,類別「正妹」就是抽象的概念,而物件「綁馬尾,穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲的女生」就是一個具體,而類別「正妹」本身再抽象化,就是介面(Interface)了,這介面可以是「女性」、「年輕」或「漂亮」。

希望以上能幫助各位了解Java物件導向的概念,若有解決您的問題還幫忙點一下廣告支持,感恩。


參考:

9 則留言:

  1. 寫的超棒的,秒懂

    回覆刪除
  2. 寫得淺顯易懂,很棒!

    回覆刪除
  3. 感激不盡,傾您所有教導初學者

    回覆刪除
  4. 十分有用,讓我又加深了理解,謝謝。

    回覆刪除
  5. 寫得太棒了! 淺顯易懂,最佳入門

    回覆刪除
  6. 講得實在太好了!! 讓我們入門菜鳥收穫許多!

    回覆刪除
  7. 寫得很好,看了就懂了,謝謝你

    回覆刪除
  8. 真的一開始會陷入撞牆期! 不懂得都想問為什麼,同事也說只要會用這樣就好,當時不懂現在才理解.....這篇寫的實在讓初學者前淺易懂呀!

    回覆刪除