《《物件导向程式设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《物件导向程式设计》PPT课件.ppt(31页珍藏版)》请在三一办公上搜索。
1、物件導向程式設計,課程定位:學習物件導向分析與設計,以UML與JAVA程式語言練習實作。課程大綱:物件導向觀念、定義與建立應用程式物件導向分析,規範問題的類別與物件的繼承、多型和介面的多重繼承與類別的關聯性Thread and Multi-ThreadJava SwingDesign Patten Concept,Object-oriented VS.Procedure-oriented,Object:”物件”,台語怎麼說?站在物件的觀點去寫程式。Procedure-oriented:先想Operation再想Data先考慮如何去做這件事情,中間過程需要那些data輔助。Object-orie
2、nted:先想Data再想Operation先想好有那些Data存在,再針對這些data會有那些動作在上面運作。,物件導向技術的三大觀念(1)-物件,定義:提供資料和處理資料程序的封裝(將變數與程序包裝在一起的集合體)如何從描述的問題中識別出可能物件?是否有【具體事物】:人、書、電腦、車子.【事件】:定購商品、借書、參加會議、旅遊.【位置】或【地方】或【結構】:座標、圖書館、長方形.英文句子中的【名詞】或【名詞子句】To be continue.,ex:請問下列哪寫是物件?哪些是屬性名稱或屬性值(狀態值)?5公尺,員工姓名,鐘錶,15公斤,訂購流程,血型,電腦,書,白色,蘋果,電話,圖書館,狗
3、,車子,MP3 Player,興趣。Ans:物件:鐘錶,訂購流程,電腦,書,蘋果,電話,圖書館,狗,車子,MP3 Player。屬性名稱或屬性值(狀態值):5公尺,員工姓名,15公斤,血型,白色,興趣。,物件導向技術的三大觀念(1)-物件,使用特徵來過濾物件:能夠保留資訊:意即資料(屬性)需要提供服務:如更改屬性的操作擁有共通的屬性:擁有共通的操作:本質的需求:需要取得其他物件資訊,定單需要取得客戶的地址屬性。多重屬性:物件擁有的屬性並非只屬於它,可以是一個擴充物件的屬性(即繼承)To be continue,物件導向技術的三大觀念(1)-物件,物件的三種特行:狀態:意即屬性,如車子的車型,排
4、汽量、色彩等等屬性;程式以變數(variable)來記錄其狀態,每一屬性項目皆有其對應的狀態值(屬性值)。行為:物件提供的操作服務,如車子可以發動、停車、換檔等操作;程式以程序/方法來表現其行為。識別字:每一物件皆擁有單獨的識別字。物件範例:一輛1800cc紅色四門的Altis車子。識別物件的屬性與行為:屬性:車型(type)、排汽量(cc)、色彩(color)、幾門(door)。行為:發動(starting)、停車(parking)、加速(speeding)、換檔(shift)。使用變數儲存屬性目前的狀態,建立方法來模擬行為:狀態:type=“Altis”、cc=1800、color=“re
5、d”、door=4。方法:starting()、parking()、speeding()、shift()。,物件導向技術的三大觀念(2)-訊息,物件使用訊息來模擬彼此的互動,訊息是物件之間的橋樑,可以啟動另一物件來執行指定的行為。發送物件(Sender)送出訊息的內容接收物件名稱執行的程序(方法)參數接收物件回應訊息的內容傳回值(Return Value)或不回應 To be Continue.,物件導向技術的三大觀念(2)-訊息,循序操作:物件送出的訊息有可能在接收物件收到後觸發另一個訊息,繼續送出一系列訊息給其它物件,須要等到其它訊息都執行完畢後,才能取得回應訊息的結果。名稱再用:過載(O
6、verload)/重載訊息的方法名稱相同,但是參數個數或資料型態不同,對於接收物件來說,已經足以從訊息判斷出是執行不同的方法。名稱再用:多型(Polymorphism),物件導向技術的三大觀念(3)類別,定義:類別(class)是一種分類,將擁有相同特性的物件集合歸類成同一個類別。類別就是物件的藍圖/樣板,可以用來建立物件,其中定義了同種類物件的共同變數(狀態)與程序(行為)。Class vs.Instance類別是一種抽象資料型態,其目的是用來建立物件,使用類別建立的物件稱為類別的個體(Instance)To be continue.,物件導向技術的三大觀念(3)類別,類別架構:繼承(Inh
7、eritance)EX:先定義Person類別來模擬人類,然後擴充Person類別建立Student與Teacher類別來模擬學生和老師,稱為繼承。Student與Teacher稱為子類別(subclass)或延申類別(derived class)。Person稱為父類別(Super class)或基礎類別(Base class)如果有多個子類別繼承同一個父類別,每一個子類別稱為兄弟類別(sibling Classes)如果父類別不只一個,稱為多重繼承。,物件導向技術的三大觀念(3)類別,類別關聯性(Relationships):類別之間擁有的合作關係專注於二元結合關係(Binary Asso
8、ciation)即兩個類別間的關聯性與相依關係(Dependency)。抽象類別:是一種不能完全代表物件的類別,抽象類別並不能用來建立InstanceEX:哺乳類是Mouse,Human,Dog的父類別,我們可以使用Mouse、Human、Dog類別各別建立Instance。但是我們不會用哺乳類建立一個哺乳類的Instance。,物件導向程式語言(Object-Oriented Languages),OOL支援三種特性封裝(Encapsulation)是將資料和程序組合起來成為類別進而建立物件。繼承(Inheritance)是物件的再利用,當定義好一個類別後,其他類別可以繼承這個類別的資料和方
9、法,並且新增或取代繼承物件的資料和方法。多型(Polymorphism)類別如果需要處理各種不同資料型態,並不需要針對不同的資料型態建立不同的類別,可以直接繼承基礎類別,繼承此類別建立同名方法處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,所以也稱為同名異式,類別與物件建立流程(1)類別宣告(如何分辨下列變數?)個體變數(Instance variable)與個體方法(Instance method)類別變數(static/class variable)與類別方法(static/class method)類別圖圖示:(+:public,-:private,#:protected,:pa
10、ckage),Java的類別與物件 封裝,類別名稱,屬性,操作,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的值並不是物件本身,而是參考到
11、此物件的指標。存取個體變數呼叫個體方法練習: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的個體方法來進行個體變數的存取。E
12、X:個體變數的取得:上述Student類別新增getName()、getAddress()、getAge()個體方法,用來取得個體內部的變數值。,Java的類別與物件 封裝,類別與物件建立流程(4)類別的建構子:希望在建立物件的同時,能夠初始個體變數值,我們需要使用類別的建構子(constructor)建構子的特性:建構子與類別同名:ex,類別Student的建構子方法名稱為Student()。建構子沒有回傳值,也不用加上void。建構子支援方法的過載(Overload):就是擁有多個同名的建構子,各建構子擁有不同的參數型態與個數。,Java的類別與物件 封裝,Java建構子是一種沒有傳回值的
13、方法,其程式碼的撰寫方式和其他成員方法相同。例如:Student類別的建構子,如下所示:public Student(String n,String a,int v)上述建構子方法名稱和類別同名。在UML類別圖的建構子是位在方法清單的開頭,我們只需在前面加上模板型態(Stereotype)。,Java的類別與物件 封裝,Java的類別與物件 封裝,使用this參考物件本身:例如:建構子或方法的參數與個體變數名稱相同時,就可以使用this關鍵字指明是存取個體變數。在類別的成員方法和建構子可以使用this關鍵字參考物件本身的成員方法和變數,如下所示:public Student(String na
14、me,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(),其宣
15、告如下: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.j
16、ava建立的UML類別和物件圖,如下圖所示:,Comparison of variables,方法的過載(OverLoad),過載(Overload)是指同樣一個名稱賦予它兩個以上的意義。因為物件是依據接收的訊息來執行不同的方法,因此物件只要能夠辨識不同的訊息,就算是同名方法,也一樣可以正確執行指定的方法。過載可適用於下列方法:類別方法的過載個體方法的過載建構子的過載this關鍵字與建構子過載,(OverLoad)(1)類別方法的過載,參數型態不同Java方法只需參數資料型態不同,就可以建立過載方法,如下所示:static int cube(int num)static double cube
17、(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)(正確)s
18、tatic 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.mon
19、th=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類別宣告的個體方法
20、和建構子,都可以使用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”;,