1 / 31

物件導向程式設計

物件導向程式設計. 課程定位:學習物件導向分析與設計,以 UML 與 JAVA 程式語言練習實作。 課程大綱: 物件導向觀念、定義與建立應用程式 物件導向分析,規範問題的類別與物件的繼承 、 多型和介面的多重繼承與類別的關聯性 Thread and Multi-Thread Java Swing Design Patten Concept. Object-oriented VS. Procedure-oriented. Object :”物件” ,台語怎麼說 ? 站在物件的觀點去寫程式。

kavindra
Download Presentation

物件導向程式設計

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 物件導向程式設計 • 課程定位:學習物件導向分析與設計,以UML與JAVA程式語言練習實作。 • 課程大綱: • 物件導向觀念、定義與建立應用程式 • 物件導向分析,規範問題的類別與物件的繼承、多型和介面的多重繼承與類別的關聯性 • Thread and Multi-Thread • Java Swing • Design Patten Concept

  2. Object-oriented VS. Procedure-oriented • Object :”物件” ,台語怎麼說? • 站在物件的觀點去寫程式。 • Procedure-oriented:先想Operation再想Data • 先考慮如何去做這件事情,中間過程需要那些data輔助。 • Object-oriented:先想Data再想Operation • 先想好有那些Data存在,再針對這些data會有那些動作在上面運作。

  3. 物件導向技術的三大觀念(1)--物件 • 定義:提供資料和處理資料程序的封裝(將變數與程序包裝在一起的集合體) • 如何從描述的問題中識別出可能物件?是否有 • 【具體事物】:人、書、電腦、車子….. • 【事件】:定購商品、借書、參加會議、旅遊…. • 【位置】或【地方】或【結構】:座標、圖書館、長方形…. • 英文句子中的【名詞】或【名詞子句】 • To be continue ….

  4. ex:請問下列哪寫是物件?哪些是屬性名稱或屬性值(狀態值)?ex:請問下列哪寫是物件?哪些是屬性名稱或屬性值(狀態值)? • 5公尺,員工姓名,鐘錶,15公斤,訂購流程,血型,電腦,書,白色,蘋果,電話,圖書館,狗,車子,MP3 Player,興趣。 • Ans: • 物件:鐘錶,訂購流程,電腦,書,蘋果,電話,圖書館,狗,車子,MP3 Player。 • 屬性名稱或屬性值(狀態值) : 5公尺,員工姓名, 15公斤,血型,白色,興趣。

  5. 物件導向技術的三大觀念(1)--物件 • 使用特徵來過濾物件: • 能夠保留資訊:意即資料(屬性) • 需要提供服務:如更改屬性的操作 • 擁有共通的屬性: • 擁有共通的操作: • 本質的需求:需要取得其他物件資訊,定單需要取得客戶的地址屬性。 • 多重屬性:物件擁有的屬性並非只屬於它,可以是一個擴充物件的屬性(即繼承) • To be continue…

  6. 物件導向技術的三大觀念(1)--物件 • 物件的三種特行: • 狀態:意即屬性,如車子的車型,排汽量、色彩等等屬性;程式以變數(variable)來記錄其狀態,每一屬性項目皆有其對應的狀態值(屬性值)。 • 行為:物件提供的操作服務,如車子可以發動、停車、換檔等操作;程式以程序/方法來表現其行為。 • 識別字:每一物件皆擁有單獨的識別字。 • 物件範例:一輛1800cc紅色四門的Altis車子。 • 識別物件的屬性與行為: • 屬性:車型(type)、排汽量(cc)、色彩(color)、幾門(door) 。 • 行為:發動(starting) 、停車(parking) 、加速(speeding) 、換檔(shift) 。 • 使用變數儲存屬性目前的狀態,建立方法來模擬行為: • 狀態:type=“Altis” 、cc=1800、color=“red” 、door=4。 • 方法:starting() 、parking() 、speeding() 、shift() 。

  7. 物件導向技術的三大觀念(2)--訊息 • 物件使用訊息來模擬彼此的互動,訊息是物件之間的橋樑,可以啟動另一物件來執行指定的行為。 • 發送物件(Sender)送出訊息的內容 • 接收物件名稱 • 執行的程序(方法) • 參數 • 接收物件回應訊息的內容 • 傳回值(Return Value) 或不回應 • To be Continue...

  8. 物件導向技術的三大觀念(2)--訊息 • 循序操作: • 物件送出的訊息有可能在接收物件收到後觸發另一個訊息,繼續送出一系列訊息給其它物件,須要等到其它訊息都執行完畢後,才能取得回應訊息的結果。 • 名稱再用:過載(Overload)/重載 • 訊息的方法名稱相同,但是參數個數或資料型態不同,對於接收物件來說,已經足以從訊息判斷出是執行不同的方法。 • 名稱再用:多型(Polymorphism)

  9. 物件導向技術的三大觀念(3)—類別 • 定義: • 類別(class)是一種分類,將擁有相同特性的物件集合歸類成同一個類別。類別就是物件的藍圖/樣板,可以用來建立物件,其中定義了同種類物件的共同變數(狀態)與程序(行為) 。 • Class vs. Instance • 類別是一種抽象資料型態,其目的是用來建立物件,使用類別建立的物件稱為類別的個體(Instance) • To be continue….

  10. 物件導向技術的三大觀念(3)—類別 • 類別架構:繼承(Inheritance) • EX: • 先定義Person類別來模擬人類,然後擴充Person類別建立Student與Teacher類別來模擬學生和老師,稱為繼承。 • Student與Teacher稱為子類別(subclass)或延申類別(derived class) 。 • Person稱為父類別(Super class)或基礎類別(Base class) • 如果有多個子類別繼承同一個父類別,每一個子類別稱為兄弟類別(sibling Classes) • 如果父類別不只一個,稱為多重繼承。

  11. 物件導向技術的三大觀念(3)—類別 • 類別關聯性(Relationships) : • 類別之間擁有的合作關係 • 專注於二元結合關係(Binary Association)即兩個類別間的關聯性與相依關係(Dependency) 。 • 抽象類別:是一種不能完全代表物件的類別,抽象類別並不能用來建立Instance • EX: 哺乳類是Mouse,Human,Dog的父類別,我們可以使用Mouse、Human、Dog類別各別建立Instance。 但是我們不會用哺乳類建立一個哺乳類的Instance。

  12. 物件導向程式語言(Object-Oriented Languages) • OOL支援三種特性 • 封裝(Encapsulation) • 是將資料和程序組合起來成為類別進而建立物件。 • 繼承(Inheritance) • 是物件的再利用,當定義好一個類別後,其他類別可以繼承這個類別的資料和方法,並且新增或取代繼承物件的資料和方法。 • 多型(Polymorphism) • 類別如果需要處理各種不同資料型態,並不需要針對不同的資料型態建立不同的類別,可以直接繼承基礎類別,繼承此類別建立同名方法處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,所以也稱為「同名異式」

  13. Java的類別與物件 –封裝 • 類別與物件建立流程(1) • 類別宣告(如何分辨下列變數?) • 個體變數(Instance variable) 與個體方法 (Instance method) • 類別變數(static/class variable) 與類別方法(static/class method) • 類別圖圖示:(+ : public, - : private, # : protected, ~ : package) 類別名稱 屬性 操作

  14. Java的類別與物件 –封裝 • 類別與物件建立流程(2) • 宣告物件變數(object variable) • EX: Student joe, jane, current; • 宣告Student類別的變數joe, jane, current,是一種區域變數(Local Variable),資料型態為Reference Data Type(指標)。 • 建立物件個體 • 使用new運算子依照類別範本來建立物件,傳回的是指向此物件的參考指標,此過程稱為實體化(Instantiation) 。 • EX: joe = new Student(); • 注意:joe的值並不是物件本身,而是參考到此物件的指標。 • 存取個體變數 • 呼叫個體方法 • 練習:http://mail.tajen.edu.tw/~reler/object/Ch10_2_1.java

  15. Java的類別與物件 –封裝 • 類別與物件建立流程(3-1) • 資訊隱藏: • 將個體變數宣告成Private,透過宣告成public的個體方法來進行個體變數的存取。 • EX:個體變數的設定:上述Student類別新增setName() 、setAddress() 、setAge()個體方法,用來設定個體內部的變數值。

  16. Java的類別與物件 –封裝 • 類別與物件建立流程(3-2) • 資訊隱藏: • 將個體變數宣告成Private,透過宣告成public的個體方法來進行個體變數的存取。 • EX:個體變數的取得:上述Student類別新增getName() 、getAddress() 、getAge()個體方法,用來取得個體內部的變數值。

  17. Java的類別與物件 –封裝 • 類別與物件建立流程(4) • 類別的建構子:希望在建立物件的同時,能夠初始個體變數值,我們需要使用類別的建構子(constructor) • 建構子的特性: • 建構子與類別同名:ex, 類別Student的建構子方法名稱為Student() 。 • 建構子沒有回傳值,也不用加上void。 • 建構子支援方法的過載(Overload) :就是擁有多個同名的建構子,各建構子擁有不同的參數型態與個數。

  18. Java的類別與物件 –封裝 • Java建構子是一種沒有傳回值的方法,其程式碼的撰寫方式和其他成員方法相同。例如:Student類別的建構子,如下所示: public Student(String n, String a, int v) { …… } • 上述建構子方法名稱和類別同名。在UML類別圖的建構子是位在方法清單的開頭,我們只需在前面加上模板型態 (Stereotype)<<constructor>>。

  19. Java的類別與物件 –封裝

  20. Java的類別與物件 –封裝 • 使用this參考物件本身: • 例如:建構子或方法的參數與個體變數名稱相同時,就可以使用this關鍵字指明是存取個體變數。 • 在類別的成員方法和建構子可以使用this關鍵字參考物件本身的成員方法和變數,如下所示: public Student(String name,String address,int age) { this.name = name; this.address = address; if ( validAge(age) ) this.age = age; else this.age = 20; }

  21. 在物件中使用類別(Static)變數與方法 • 類別(static)變數:掌握某一類別物件的共同特徵,該變數內容為同類別物件所共用,任何一個個體更改該變數內容則所有同類別物件會一體適用。 • 所有物件都是使用同一份類別變數和呼叫同一個類別方法。類別變數儘量用類別方法來存取。 • 例如:Student類別擁有:類別變數teacherNo、count和類別方法getStudentCount(),其宣告如下: class Student { public static String teacherNo = "T100"; private static int count = 0; ………... public static int getStudentCount() { return count; } ……….. }

  22. 在物件使用類別變數與方法--UML類別圖 • 在UML類別圖的「類別範圍」(Class Scope)屬性或方法需要加上底線,Student類別圖示,如右圖所示: • 範例程式:http://mail.tajen.edu.tw/~reler/object/Ch10_6_1.java

  23. 在物件使用類別變數與方法--UML類別與物件圖 • Java程式Ch10_6.java建立的UML類別和物件圖,如下圖所示:

  24. Comparison of variables

  25. 方法的過載(OverLoad) • 「過載」(Overload)是指同樣一個名稱賦予它兩個以上的意義。因為物件是依據接收的訊息來執行不同的方法,因此物件只要能夠辨識不同的訊息,就算是同名方法,也一樣可以正確執行指定的方法。過載可適用於下列方法: • 類別方法的過載 • 個體方法的過載 • 建構子的過載 • this關鍵字與建構子過載

  26. (OverLoad)–(1)類別方法的過載 • 參數型態不同 • Java方法只需參數資料型態不同,就可以建立過載方法,如下所示: static int cube(int num) static double cube(double num) • 上述2個同名方法只有參數的資料型態不同。 • 參數個數不同 • 如果Java方法的參數個數不同,也可以建立過載方法,如下所示: static int getMin(int a, int b) static int getMin(int a, int b, int c) • 上述同名方法的參數個數分別為2和3。

  27. (OverLoad)–(1)類別方法的過載 • 注意:方法傳回值並非訊息內容,因此不同資料型態的傳回值,並不能產生不同訊息。 • 過載方法不可以只有不同的回傳值!! • 例如:(錯誤) static int square(double no) static double square(double no) (正確) static int square(int no) static double square(double no)

  28. (OverLoad)–(2)個體方法的過載 • 如同類別方法的過載允許(1)參數型態不同,(2)參數個數不同。 • 例如: class Date { private int day,month,year; public void setDate(int day,int month, int year) { this.day = day; this.month = month; this.year = year; } public void setDate(int day, int month) { this.day = day; this.month = month; this.year = 2006; } }

  29. (OverLoad)–(3)建構子的過載 • Java類別宣告的建構子也支援過載,我們可以建立多個同名的建構子方法,只需擁有不同的參數型態或個數即可。 • 例如 class Date { private int day,month,year; public Date() { day=1; month=1; year = 1970; } public Date(int day, int month, int year) { this.day=day; this.month=month; this.year = year; } }

  30. (OverLoad)–(4) this關鍵字與建構子過載 • 在Java類別宣告的個體方法和建構子,都可以使用this關鍵字來參考物件本身的個體方法和變數。 • 如果在建構子使用this,我們更可建立簡潔的多個建構子過載方法。 • 例如: class Date { private int day, month, year; public Date() { this(1, 1, 2103); } public Date(int d) { this(d, 1, 2103); } public Date(int d, int m) { this(d, m, 2103); } public Date(int day, int month, int year) { this.day=day; this.month=month; this.year = year; } }

  31. 練習:請下載下列程式碼: • http://mail.tajen.edu.tw/~reler/object/Ch13_1_2.java • 增加setDate過載方法可以辨識一個參數(指定日) ,與沒有參數(不指定) 。 • 執行setDate(10)與setDate()並顯示以下的資訊:”指定日月: 10/9/2006”; “不指定 : 1/9/2006”;

More Related