310 likes | 747 Views
物件導向程式設計. 課程定位:學習物件導向分析與設計,以 UML 與 JAVA 程式語言練習實作。 課程大綱: 物件導向觀念、定義與建立應用程式 物件導向分析,規範問題的類別與物件的繼承 、 多型和介面的多重繼承與類別的關聯性 Thread and Multi-Thread Java Swing Design Patten Concept. Object-oriented VS. Procedure-oriented. Object :”物件” ,台語怎麼說 ? 站在物件的觀點去寫程式。
E N D
物件導向程式設計 • 課程定位:學習物件導向分析與設計,以UML與JAVA程式語言練習實作。 • 課程大綱: • 物件導向觀念、定義與建立應用程式 • 物件導向分析,規範問題的類別與物件的繼承、多型和介面的多重繼承與類別的關聯性 • Thread and Multi-Thread • Java Swing • Design Patten Concept
Object-oriented VS. Procedure-oriented • Object :”物件” ,台語怎麼說? • 站在物件的觀點去寫程式。 • Procedure-oriented:先想Operation再想Data • 先考慮如何去做這件事情,中間過程需要那些data輔助。 • Object-oriented:先想Data再想Operation • 先想好有那些Data存在,再針對這些data會有那些動作在上面運作。
物件導向技術的三大觀念(1)--物件 • 定義:提供資料和處理資料程序的封裝(將變數與程序包裝在一起的集合體) • 如何從描述的問題中識別出可能物件?是否有 • 【具體事物】:人、書、電腦、車子….. • 【事件】:定購商品、借書、參加會議、旅遊…. • 【位置】或【地方】或【結構】:座標、圖書館、長方形…. • 英文句子中的【名詞】或【名詞子句】 • To be continue ….
ex:請問下列哪寫是物件?哪些是屬性名稱或屬性值(狀態值)?ex:請問下列哪寫是物件?哪些是屬性名稱或屬性值(狀態值)? • 5公尺,員工姓名,鐘錶,15公斤,訂購流程,血型,電腦,書,白色,蘋果,電話,圖書館,狗,車子,MP3 Player,興趣。 • Ans: • 物件:鐘錶,訂購流程,電腦,書,蘋果,電話,圖書館,狗,車子,MP3 Player。 • 屬性名稱或屬性值(狀態值) : 5公尺,員工姓名, 15公斤,血型,白色,興趣。
物件導向技術的三大觀念(1)--物件 • 使用特徵來過濾物件: • 能夠保留資訊:意即資料(屬性) • 需要提供服務:如更改屬性的操作 • 擁有共通的屬性: • 擁有共通的操作: • 本質的需求:需要取得其他物件資訊,定單需要取得客戶的地址屬性。 • 多重屬性:物件擁有的屬性並非只屬於它,可以是一個擴充物件的屬性(即繼承) • To be continue…
物件導向技術的三大觀念(1)--物件 • 物件的三種特行: • 狀態:意即屬性,如車子的車型,排汽量、色彩等等屬性;程式以變數(variable)來記錄其狀態,每一屬性項目皆有其對應的狀態值(屬性值)。 • 行為:物件提供的操作服務,如車子可以發動、停車、換檔等操作;程式以程序/方法來表現其行為。 • 識別字:每一物件皆擁有單獨的識別字。 • 物件範例:一輛1800cc紅色四門的Altis車子。 • 識別物件的屬性與行為: • 屬性:車型(type)、排汽量(cc)、色彩(color)、幾門(door) 。 • 行為:發動(starting) 、停車(parking) 、加速(speeding) 、換檔(shift) 。 • 使用變數儲存屬性目前的狀態,建立方法來模擬行為: • 狀態:type=“Altis” 、cc=1800、color=“red” 、door=4。 • 方法:starting() 、parking() 、speeding() 、shift() 。
物件導向技術的三大觀念(2)--訊息 • 物件使用訊息來模擬彼此的互動,訊息是物件之間的橋樑,可以啟動另一物件來執行指定的行為。 • 發送物件(Sender)送出訊息的內容 • 接收物件名稱 • 執行的程序(方法) • 參數 • 接收物件回應訊息的內容 • 傳回值(Return Value) 或不回應 • To be Continue...
物件導向技術的三大觀念(2)--訊息 • 循序操作: • 物件送出的訊息有可能在接收物件收到後觸發另一個訊息,繼續送出一系列訊息給其它物件,須要等到其它訊息都執行完畢後,才能取得回應訊息的結果。 • 名稱再用:過載(Overload)/重載 • 訊息的方法名稱相同,但是參數個數或資料型態不同,對於接收物件來說,已經足以從訊息判斷出是執行不同的方法。 • 名稱再用:多型(Polymorphism)
物件導向技術的三大觀念(3)—類別 • 定義: • 類別(class)是一種分類,將擁有相同特性的物件集合歸類成同一個類別。類別就是物件的藍圖/樣板,可以用來建立物件,其中定義了同種類物件的共同變數(狀態)與程序(行為) 。 • Class vs. Instance • 類別是一種抽象資料型態,其目的是用來建立物件,使用類別建立的物件稱為類別的個體(Instance) • To be continue….
物件導向技術的三大觀念(3)—類別 • 類別架構:繼承(Inheritance) • EX: • 先定義Person類別來模擬人類,然後擴充Person類別建立Student與Teacher類別來模擬學生和老師,稱為繼承。 • Student與Teacher稱為子類別(subclass)或延申類別(derived class) 。 • Person稱為父類別(Super class)或基礎類別(Base class) • 如果有多個子類別繼承同一個父類別,每一個子類別稱為兄弟類別(sibling Classes) • 如果父類別不只一個,稱為多重繼承。
物件導向技術的三大觀念(3)—類別 • 類別關聯性(Relationships) : • 類別之間擁有的合作關係 • 專注於二元結合關係(Binary Association)即兩個類別間的關聯性與相依關係(Dependency) 。 • 抽象類別:是一種不能完全代表物件的類別,抽象類別並不能用來建立Instance • EX: 哺乳類是Mouse,Human,Dog的父類別,我們可以使用Mouse、Human、Dog類別各別建立Instance。 但是我們不會用哺乳類建立一個哺乳類的Instance。
物件導向程式語言(Object-Oriented Languages) • OOL支援三種特性 • 封裝(Encapsulation) • 是將資料和程序組合起來成為類別進而建立物件。 • 繼承(Inheritance) • 是物件的再利用,當定義好一個類別後,其他類別可以繼承這個類別的資料和方法,並且新增或取代繼承物件的資料和方法。 • 多型(Polymorphism) • 類別如果需要處理各種不同資料型態,並不需要針對不同的資料型態建立不同的類別,可以直接繼承基礎類別,繼承此類別建立同名方法處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,所以也稱為「同名異式」
Java的類別與物件 –封裝 • 類別與物件建立流程(1) • 類別宣告(如何分辨下列變數?) • 個體變數(Instance variable) 與個體方法 (Instance method) • 類別變數(static/class variable) 與類別方法(static/class method) • 類別圖圖示:(+ : public, - : private, # : protected, ~ : package) 類別名稱 屬性 操作
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
Java的類別與物件 –封裝 • 類別與物件建立流程(3-1) • 資訊隱藏: • 將個體變數宣告成Private,透過宣告成public的個體方法來進行個體變數的存取。 • EX:個體變數的設定:上述Student類別新增setName() 、setAddress() 、setAge()個體方法,用來設定個體內部的變數值。
Java的類別與物件 –封裝 • 類別與物件建立流程(3-2) • 資訊隱藏: • 將個體變數宣告成Private,透過宣告成public的個體方法來進行個體變數的存取。 • EX:個體變數的取得:上述Student類別新增getName() 、getAddress() 、getAge()個體方法,用來取得個體內部的變數值。
Java的類別與物件 –封裝 • 類別與物件建立流程(4) • 類別的建構子:希望在建立物件的同時,能夠初始個體變數值,我們需要使用類別的建構子(constructor) • 建構子的特性: • 建構子與類別同名:ex, 類別Student的建構子方法名稱為Student() 。 • 建構子沒有回傳值,也不用加上void。 • 建構子支援方法的過載(Overload) :就是擁有多個同名的建構子,各建構子擁有不同的參數型態與個數。
Java的類別與物件 –封裝 • Java建構子是一種沒有傳回值的方法,其程式碼的撰寫方式和其他成員方法相同。例如:Student類別的建構子,如下所示: public Student(String n, String a, int v) { …… } • 上述建構子方法名稱和類別同名。在UML類別圖的建構子是位在方法清單的開頭,我們只需在前面加上模板型態 (Stereotype)<<constructor>>。
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; }
在物件中使用類別(Static)變數與方法 • 類別(static)變數:掌握某一類別物件的共同特徵,該變數內容為同類別物件所共用,任何一個個體更改該變數內容則所有同類別物件會一體適用。 • 所有物件都是使用同一份類別變數和呼叫同一個類別方法。類別變數儘量用類別方法來存取。 • 例如:Student類別擁有:類別變數teacherNo、count和類別方法getStudentCount(),其宣告如下: class Student { public static String teacherNo = "T100"; private static int count = 0; ………... public static int getStudentCount() { return count; } ……….. }
在物件使用類別變數與方法--UML類別圖 • 在UML類別圖的「類別範圍」(Class Scope)屬性或方法需要加上底線,Student類別圖示,如右圖所示: • 範例程式:http://mail.tajen.edu.tw/~reler/object/Ch10_6_1.java
在物件使用類別變數與方法--UML類別與物件圖 • Java程式Ch10_6.java建立的UML類別和物件圖,如下圖所示:
方法的過載(OverLoad) • 「過載」(Overload)是指同樣一個名稱賦予它兩個以上的意義。因為物件是依據接收的訊息來執行不同的方法,因此物件只要能夠辨識不同的訊息,就算是同名方法,也一樣可以正確執行指定的方法。過載可適用於下列方法: • 類別方法的過載 • 個體方法的過載 • 建構子的過載 • this關鍵字與建構子過載
(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。
(OverLoad)–(1)類別方法的過載 • 注意:方法傳回值並非訊息內容,因此不同資料型態的傳回值,並不能產生不同訊息。 • 過載方法不可以只有不同的回傳值!! • 例如:(錯誤) static int square(double no) static double square(double no) (正確) static int square(int no) static double square(double no)
(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; } }
(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; } }
(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; } }
練習:請下載下列程式碼: • http://mail.tajen.edu.tw/~reler/object/Ch13_1_2.java • 增加setDate過載方法可以辨識一個參數(指定日) ,與沒有參數(不指定) 。 • 執行setDate(10)與setDate()並顯示以下的資訊:”指定日月: 10/9/2006”; “不指定 : 1/9/2006”;