所謂的物件 (object) 是一種比擬,以中文來說「物件」也就是物品的意思,物件的英文原文為 object ,其實 object 就是對象或東西的意思。物件導向程式語言所講的物件,就像日常生活隨處可見的東西,如電視有形體,螢幕長寬比例等,也有功能,打開電源便可觀看節目。
物件就是程式中依需要自行設計的東西,我們以下圖的一個灰色圓圈表示物件的概念

我們可以替物件定義屬性 (field) ,如電視的形體,有長、寬等可資測量出的數值,也可定義方法 (method) ,如電視的功能,打開電源或是關閉電源。下圖用長方形表示屬性,橢圓形表示方法,屬性和方法合稱類別的成員 (member)

屬性就是物件專屬的數值,用一個變數來記錄,例如電視的尺寸、頻道等。方法是物件的功能,例如電視的電源開關,打開或關上。方法亦為一個變數名稱,最後需要接上一組小括號,變數名稱與小括號之間不能有空格,每個可執行的 Java 程式被稱為 app ,也就是應用程式。這樣的物件裡面一定要有個 main() 方法

假設我們要執行 AnimalApp 物件的 Java 程式,當作業系統收到通知後,就會啟動 JVM ,然後 JVM 會去找該物件的 main() 方法,這是程式執行的起點

凡是可執行的 Java 程式,或稱 app 都一定得定義 main() 方法,這是 Java 語言的規則之一,因為 main() 方法要作為程式執行的起點。若是缺少了 main() 方法, JVM 會不知道從哪裡開始執行程式。
AnimalApp 物件的 main() 中另外建構了 Animal 物件,這時候, AnimalApp 物件的 main() 便會有一個指向 Animal 物件的參考 (reference)

然後 Animal 物件呼叫自己的 intro() 方法,這是在螢幕上印出訊息,向使用者介紹物件自己

由於 intro() 方法需要用到屬性 name ,因此這時候會從物件裡拿 name 放到 intro() 方法執行

執行結果就是在螢幕上印出 "Hello 我是大象 Alice" 的字串 (string) 囉

執行結束,假設沒有再使用到 Animal 物件的屬性或方法,程式執行的控制權就會回轉給 AnimalApp 物件的 main()

如果 AnimalApp 物件的 main() 也沒有再執行其他的程式碼,這時候, JVM 就會把控制權還給作業系統

寫 Java 程式需要認識物件,實際利用類別 (class) 設計自己所需的物件,因此類別為設計物件的藍圖。另外也可以制定物件共通的介面 (interface) ,然後給實作 (implement) 出這個介面的類別改寫 (override) 屬性及方法

常見的汽車,每一款汽車的操控介面大致相同,然後裡頭的的組成卻有很多不一樣的地方,例如驅動方式、傳動型式、引擎結構等等,如果我們設計一個賽車的 Java 遊戲,車子的時速就需要用屬性來記錄,而加速、轉彎都需要用方法來控制。
假如我們需要設計的各種類別物件有許多共同的特性,例如完全一樣的的屬性及方法,只有某些特定類別需要改寫方法,或是增加新的屬性、方法,這時候,物件導向的 Java 語言提供了繼承 (inheritence) 機制

大體上可以先規劃出父類別 (superclass) ,然後再規劃個別子類別 (subclass) 的項目,也可以反過來,當發展出許多擁有共通特性的類別時,把共通特性提取出來設計父類別,然後原本設計的類別繼承父類別。
繼承有點像介面,然而介面屬於共通規格,並且實作介面的類別都得改寫介面中定義的方法,利用繼承則可以沿用父類別所定義的屬性及方法,因此繼承可以達到有效的重複使用、擴充已經規劃完善的程式,以減少大型專案的開發時間。
「繼承」是程式語言社群習慣用詞,英文動詞原文為 inherit ,意思泛指從什麼得到什麼,所以生物學中的「遺傳」也是用這個詞。實際上物件導向程式設計的繼承機制相當複雜,然而中文的繼承常用於某物不再,另物將起的意思,譬如我繼承某某的精神,雖然某某不見得已死,可是將來要付出努力的卻是我而非某某,因而這裡的意思中文用「遺傳」比較恰當,子代會從親代遺傳性狀,子代與親代也會並存一段時間,這就沒有某物不再的意含了。
中英文術語對照 | |
---|---|
物件導向 | object-oriented |
程式語言 | programming language |
程式 | program |
編譯 | compile |
原始碼 | source code |
JVM | Java Virtual Machine |
物件 | object |
屬性 | field |
方法 | method |
成員 | member |
參考 | reference |
字串 | string |
類別 | class |
介面 | interface |
實作 | implement |
改寫 | override |
繼承 | inheritence |
父類別 | superclass |
子類別 | subclass |
參考資料
http://download.oracle.com/javase/tutorial/getStarted/intro/definition.html
http://download.oracle.com/javase/tutorial/java/concepts/object.html
http://download.oracle.com/javase/tutorial/java/concepts/inheritance.html
http://download.oracle.com/javase/tutorial/java/concepts/interface.html
http://download.oracle.com/javase/tutorial/getStarted/intro/definition.html
http://download.oracle.com/javase/tutorial/java/concepts/object.html
http://download.oracle.com/javase/tutorial/java/concepts/inheritance.html
http://download.oracle.com/javase/tutorial/java/concepts/interface.html
沒有留言:
張貼留言