Java 物件導向的概念 - 菜鳥工程師肉豬
文章推薦指數: 80 %
在Java中,類別(Class)是一種類似規格書的東西(有些書會比喻成藍圖(blueprint))。
類別用來定義一個物件(Object)擁有哪些特性(properties)及行為(methods)。
舉個實際的 ...
AdSense
網頁
首頁
關於我
2017/10/24
Java物件導向的概念
什麼是物件導向呢?物件導向的英文是Object-orientedProgramming,又簡稱OO或OOP,中國用語是面向对象。
前言
我記得第一次看到物件導向是在一本VBA教學的書中看到的,那時候會買這本書是想精進Excel的能力,因為聽說巨集很厲害,似乎跟VBA有關,就跑到書店買了本VBA教學的書,不過這本書最後也沒看完,只記得看到物件導向介紹那裡就放棄了,因為不知道在講啥,直到學了Java一陣子後才逐漸了解什麼是物件導向程式,什麼是類別,什麼是物件等觀念。
在開始學習Java的初期只曉得某段程式碼可達到某種效果,但卻不知道為什麼要這樣寫,也不知道這樣的寫法就是物件導向程式,所以若是您已經學習Java一陣子了,但仍不清楚物件導向是什麼,別氣餒,隨著經驗累積會逐漸豁然開朗的。
在說明物件導向程式以前先說明什麼是程式。
程式就是一連串的指令敘述,其用來指揮機器(電腦)要做什麼。
以LINE手機應用程式(app)為例,其由許多程式來達到某些功能,例如發送訊息。
當在LINE輸入好文字並按確定後,LINE裡面就會有個程式開始運作,可能包括以下步驟...
接收輸入文字訊息。
將文字訊息送到LINE的伺服器。
紀錄發送文字的時間。
將文字訊息傳送至對方的手機。
傳統的程式語言例如C語言,程式是由許多函式(Function)所構成,例如以上四個步驟可能就是代表四個函式依序執行。
而物件導向程式如Java,程式是由各種類別(Class)所構成,透過類別所產生的物件(Objects)來執行各種操作的編排。
若您是剛接觸程式的初學者看不懂上面兩段話很正常,程式這種東西往往要有實際的撰寫經驗才知道書上講的意思,但弔詭的是,若不懂是要怎麼使用呢?這就是學習程式奇妙的地方,我認為初學程式的時候「不要」求甚解,否則很快就會沮喪放棄,剛開始只要"會用"就好。
例如LINE可以和朋友傳訊息聊天,我們只要知道怎麼輸入文字及傳送就夠了,即使不知道怎麼運作一樣可以傳訊息。
學程式也是一樣,例如剛開始學Java都會從System.out.println("HelloWorld");開始,你可能會想為什麼要打System.out.println()?,System代表什麼?那個.又是什麼,out是什麼?println()是什麼等一堆疑惑。
但建議初學的你先將這些問題擱一旁,此時只要知道System.out.println("HelloWorld");會在畫面印出HelloWorld這幾個字就夠了。
類別與物件
回到主題,你可能會問類別是什麼東西?實例化又是什麼?請看以下說明...。
在Java中,類別(Class)是一種類似規格書的東西(有些書會比喻成藍圖(blueprint))。
類別用來定義一個物件(Object)擁有哪些特性(properties)及行為(methods)。
舉個實際的例子,例如我想寫個賽車遊戲的程式,那通常會有賽車,賽道,選手等要素(當然還有很多其他要素)。
以物件導向來設計的話,首先必須建立一個賽車類別,所以建立一個Car.java(類別可任意命名,例如也可改成RacingCar.java),而我希望賽車可以更換顏色(color),品牌(brand)及速度(speed)等特性,以及加速(accelerate),煞車(brake)等行為,所以我必須在Car.java去定義這些特性與行為如下。
publicclassCar{
/**顏色屬性*/
Stringcolor;
/**品牌屬性*/
Stringbrand;
/**速度屬性*/
intspeed;
/**加速方法*/
voidaccelerate(){
this.speed++;//加速(速度+1)
}
/**煞車方法*/
voidbrake(){
this.speed--;//煞車(速度-1)
}
}
上面的Car.java就是一個完整而簡單的Java類別,我們透過撰寫這個類別來定義我們想要的賽車的特性(properties)及行為(methods)(method又稱作方法)。
注意此時程式中只有類別而已,並沒有物件。
在Java中,物件必須由定義好的類別來產生,在Java中建立物件的語法為:
類別名稱物件名稱=new類別名稱();
當然實務中不會像上面一樣打中文,這只是用來說明而已。
例如我們想要建立一個Car.java類別的物件則在程式中撰寫如下:
Carcar1=newCar();
new為Java的關鍵字,用途為用來建立一個新物件。
這邊的car1即為一個以Car類別所產生的物件。
上面建立物件的程式若以文字來描述為:
建立一個Car類別的物件,並將該物件給與一個識別名稱叫car1
令初學者痛苦混淆的地方到了,此時您可能還是分不清楚類別和物件的區別,所以我多舉個例子來說明。
以現實世界的概念來看,我是個人(Human),你也是個人,隔壁的老王也是個人,此時你會認為你,我及老王是相同的嗎?在回答問題之前,我們先必須知道我們是站在什麼角度回答。
如果是以個體的角度來看,則你,老王與我當然是不同的,因為你可能叫小明,我叫肉豬,他叫老王,此外我們年齡、身高也都不一樣,所以答案是不相同。
但若改以人類(Human)這更高的角度來看,我們都同樣是屬於「人類」這個類別,則我們是相同的,因為我們擁有屬於人類的共同特性。
回到物件導向來看,人類就是一種類別的概念,但"人類"並不代表某個特定的人,而是所有人所抽象出來的概念,而老王則代表特定的一個人類,他就是人類這個類別的一個物件,你和我也都是人類類別的物件,所以人類是類別,老王,你,我是物件。
而因為我們都屬於人類這個類別的物件,也因此我們都具有相同的特性與行為(方法)。
而其他類別,例如鳥類別,就和我們有不同的特性與方法,例如鳥類別的行為有"飛(fly)"及羽毛(feather),但人類沒有。
若一個類別被實例化(instantiate),是指建立一個該類別的物件(Object),所以在Java中實例(instance)和物件(Object)指的是相同的東西。
而所謂實例化,就是以某類別建立一個該類別的物件的意思,也就是上面的newCar();這個動作。
若看完以上解釋還很模糊很正常,只要多寫點程式有一天必定能參透其觀念。
抽象
最後解釋一下抽象(abstraction)這個詞,相信大家學習物件導向程式的時候一定常在書中或課堂上接觸過這個詞,也是後來才了解抽象的意思,因為「抽象」這個詞本身就挺抽象了:p。
抽象這兩個字剛開始我直接聯想到的是畢卡索的抽象畫,他的畫通常線條很簡單,但不知道在畫什麼?直到後來了解抽象的意思後才了解何以他的畫被稱做抽象畫。
在維基百科上對於抽象的解釋如下
抽象化(英語:Abstraction)是指以縮減一個概念或是一個現象的資訊含量來將其廣義化(Generalization)的過程,主要是為了只保存和一特定目的有關的資訊。
例如,將一個皮製的足球抽象化成一個球,只保留一般球的屬性和行為等資訊。
相似地,亦可以將快樂抽象化成一種情緒,以減少其在情緒中所含的資訊量。
另一篇計算機科學的解釋為
在電腦科學中,抽象化(英語:Abstraction)是將資料與程式,以它的語意來呈現出它的外觀,但是隱藏起它的實作細節。
抽象化是用來減少程式的複雜度,使得程式設計師可以專注在處理少數重要的部份。
一個電腦系統可以分割成幾個抽象層(Abstractionlayer),使得程式設計師可以將它們分開處理。
看到這邊應該覺得有點莫名其妙,明明寫得是中文但不知道為什麼就是看不懂,寫得實在是太「抽象」了。
若要了解抽象的意義,應與其相對詞「具體(concrete)」一起來比較才容易了解。
例如你與哥們兒在逛街,你和一位正妹擦肩而過,基於分享的心態驚呼:「快看,正妹!」,但可惜為時已晚,你哥們回頭看時只看見一堆人的背影,便問:「哪個正妹阿?」,你舉起手指著逐漸遠去的正妹背影說:「就那個阿,超正的!」,你哥們說:「靠!這樣比我哪知道,可不可以具體一點?」,你說:「那個綁馬尾,穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲的那個阿!」,你哥們聽到你的描述後,馬上衝到描述的正妹前面,若無其事偷偷回頭撇了一眼,然後跑回來說:「幹!真的超正,奶又大!」,然後賊賊地笑了起來。
從上面的情境中,各位分得出何謂具體,何謂抽象呢?
在例子中,「正妹」是抽象,「穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲的那個(女生)」是具體,而「正妹」是一個抽象概念,只要是年輕美麗具有性吸引力的女性都可稱之。
正妹不一定要穿黑絲,但放眼望去無數背影,各個似乎都是正妹,若要分別每一位正妹,則要給予每個正妹其具體的特色,例如髮型、身材、穿著、身高等,透過這些特色,就成了個具體的正妹了,所以這個「綁馬尾,穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲的那個(女生)」就不再同於旁邊的「波浪捲,著鵝黃色小洋裝,搭白色涼鞋的正妹」,但我們可以用「正妹」來形容這兩個女生,因為她們具有一個共同的抽象概念,也就是「年輕美麗具有性吸引力的女性」,有了「正妹」這個詞,我們從此可以涵蓋更多不同打扮的漂亮妹妹了。
上面這例子可能舉得不太好,再舉個比較簡單的例子。
汽車對於BenzC300或Mazda6,汽車是抽象的,而BenzC300和Mazda6是具體的。
交通工具對於飛機或汽車,交通工具是抽象的,飛機或汽車是具體的,
所以抽象或具體,要把相對性納入考慮,看是拿什麼比什麼。
而一個抽象的東西,或許還可以再從中抽出更抽象的東西。
呼應之前關於類別的說明,類別「正妹」就是抽象的概念,而物件「綁馬尾,穿粉色細肩帶,超短白色牛仔熱褲,透膚黑絲的女生」就是一個具體,而類別「正妹」本身再抽象化,就是介面(Interface)了,這介面可以是「女性」、「年輕」或「漂亮」。
希望以上能幫助各位了解Java物件導向的概念,若有解決您的問題還幫忙點一下廣告支持,感恩。
參考:
Java什麼是多載(Overload),覆寫(Override),多型(Polymorphism)
Java物件導向程式設計原則SOLIDDesignPrinciples
Java什麼是封裝(Encapsulation)
什麼是框架(Framework)
Windows安裝EclipseJava開發環境教學
標籤:
java
9則留言:
匿名
提到...
寫的超棒的,秒懂
2018年8月9日晚上11:48
匿名
提到...
寫得淺顯易懂,很棒!
2019年2月6日晚上9:37
Unknown
提到...
感激不盡,傾您所有教導初學者
2019年6月28日凌晨3:32
易禪
提到...
十分有用,讓我又加深了理解,謝謝。
2019年7月1日晚上7:43
Unknown
提到...
寫得太棒了!淺顯易懂,最佳入門
2019年9月22日凌晨2:50
匿名
提到...
講得實在太好了!!讓我們入門菜鳥收穫許多!
2020年7月29日晚上7:03
匿名
提到...
寫得很好,看了就懂了,謝謝你
2020年11月17日晚上10:58
匿名
提到...
寫的真棒推推
2020年11月21日晚上11:56
匿名
提到...
真的一開始會陷入撞牆期!不懂得都想問為什麼,同事也說只要會用這樣就好,當時不懂現在才理解.....這篇寫的實在讓初學者前淺易懂呀!
2021年5月28日凌晨2:08
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言(Atom)
AdSense
搜尋此網誌
總網頁瀏覽量
延伸文章資訊
- 1定義類別 - Java 學習系列
每個Java程式都會有一個或一個以上的類別。 類別是由「資料成員field」與「函數method」封裝而成。 class 類別名稱 ... 看到class class01 的地方,這邊就是一個類別!
- 2類別(Class)-基礎- Java學習筆記
類別(Class)可說是建立物件的一個藍圖,是一個使用者自行定義的資料型態。 ... 由以上範例可知class有如一個分類,該分類定義了各種特徵、行為、運作方式, 藉由表示某物是 ...
- 3Java :: 定義類別
- 4第七章物件導向設計: 類別與物件
Java是一個物件導向程式語言(OOPL;. Object-Oriented Program Language). 所謂物件導向設計理念,就是利用軟體模擬現實. 生活中實體所擁有的特性與行為,這...
- 5我要學會Java (二):物件導向其實很簡單 - Noob's Space
class Student{ public String name; public int score; ... 最後要講的是類別方法,類別方法又稱靜態方法,所以宣告方法的時候加一個static...