Download presentation
Presentation is loading. Please wait.
1
5 物件導向程式設計 Object Oriented Programming
5-1 物件導向程式的設計觀念 (OOP Concepts) 5-2 類別的設計 (Class Implementation) 5-3 物件的生命週期 (The Life Cycle of an Object)
2
5-1 物件導向程式的設計觀念 程式設計方法的演變 5-1-1 何謂物件 Object?
我們生活四周存在著許多的“物件”,如有形物件的汽車、微波爐等,和無形物件的銀行帳戶、學生成績等。 軟體上的物件是一組變數及其相關函數(或稱方法method)所組成的軟體單位。
3
5-1 物件導向程式的設計觀念 變數是記錄物件的狀態(或稱屬性properties),函數是描述物件的行為(或稱功能functions)。
如下圖是一個描述汽車的軟體物件。
4
5-1 物件導向程式的設計觀念 5-1-2 何謂訊息 Message? 當物件A要執行物件B內的函數時,物件A所丟出來的資訊就是訊息。
訊息內容必須包括執行者(那個物件)、執行什麼(物件內那個函數)以及函數執行所需要的資料。
5
5-1 物件導向程式的設計觀念 5-1-3 何謂類別 Class?
汽車是根據汽車藍圖(Blueprint)製造出來,物件也是根據它的藍圖所產生,而類別就是據以產生物件的藍圖,它描述物件內所有的變數及函數。如前述汽車的類別:
6
5-1 物件導向程式的設計觀念 一張汽車藍圖可以製造出許多同款的汽車,一個類別可以產生任何數量的物件。
相同類別的不同物件,有著相同的函數,所以一個執行函數的訊息,要指明是那個物件的那個函數。另外變數也是各有一套,分別記錄物件各自的狀態。
7
5-1 物件導向程式的設計觀念 5-1-4 何謂封裝 Encapsulation ?
封裝的目的是讓使用者不需知道物件內部是如何運作,就能透過操作介面,完成使用的目的,如日常生活的微波爐。 軟體上所謂的封裝是指將軟體中的變數及使用變數的函數封裝在一起成為一個物件,並依需要設定為多重的控管等級。
8
5-2 類別的設計Class Implement
5-2-1 類別的定義 The Class Definition 將前面的汽車藍圖用程式指令來定義,可寫成: public class Car { // 定義類別名稱,名稱前面一定是public class // 以下稱實作變數instance variables (或稱變數成員data member) private int currentSpeed; private int currentCadence; public int currentGear; // 以下稱實作函數instance method (或稱函數成員member function) public void speed(int intSpeed) { currentSpeed += intSpeed; } public void brake() { currentSpeed = 0; public void changeGear(int GearNo) { currentGear = GearNo;
9
5-2 類別的設計Class Implement
定義類別標題 public class 類別名稱 { } 如 public class Car { } 定義類別變數與函數 擷取方式定義 (static) 變數型態 變數名稱; 擷取方式定義 (static) 回應值型態 函數名稱(函數參數); 如 private int currentSpeed; public void changeGear(int GearNo) { }
10
5-2 類別的設計Class Implement
擷取方式定義access modifiers 又稱能見度定義visibility modifiers或擷取等級access level "public",意指物件的使用者可以讀取這些變數或執行這些函數。如果不要物件的使用者讀取這些變數或執行這些函數,將擷取方式定義設為"private"或”protected”。 當類別中的變數或函數限制於本身或繼承才能使用時,則可定義為protected。
11
5-2 類別的設計Class Implement
各別instance 與共用Class (Static) 如果同一類別的每個物件共用一個變數或函數時,這個變數或函數稱為類別(或靜態)變數或類別(或靜態)函數,它們以"static" 關鍵字標註。 public class Taxi { public static int gasTank; private int gas; public void fillGas(int qty){ // 加油到計程車油箱 gas+=qty; // 從油料庫取油 gasTank-=qty; }
12
5-2 類別的設計Class Implement
5-2-2 UML(Unified Modeling Language )在JAVA的使用 如汽車類別的UML寫成: 第一格表類別名稱,第二格描述變數,第三格描述函數。 "+" 表該變數或函數為public,"-" 表該變數或函數為private。 “()” 裡面表輸入的變數名稱與型態。 ":" 後面表輸出的資料型態。
13
5-2 類別的設計Class Implement
5-2-3 Time Class 的範例 假設我們要寫個程式記錄徑賽選手 的成績 首先我們想:物件的使用者對這個CTime物件會有那些動作要求? 設定時間 讀取時間,細分為時、分、秒的讀取 顯示時間
14
5-2 類別的設計Class Implement
每個動作寫成程式碼就是一個函數,這些函數合起來就是CTime類別的公用介面: boolean setTime(int hours,int mins,int secs); int getHours(); int getMins(); int getSecs(); void print(); 另外在公用介面內必須至少有一個用以產生物件的建構函數Construtor,而且可以不止一個: CTime(); CTime(int hours,int mins,int secs);
15
5-2 類別的設計Class Implement
建構函數 (Construtor) 建構函數是類別內的一個成員函數,當宣告類別的物件時它會自動執行。建構函數是用來設定物件的初始狀態。 建構函數有一些特別規定: 函數名稱必須與類別名稱相同 它沒有回應值,也不必設定void 可有多個建構函數,當然它們的函數名稱都必須與類別名稱一樣,但它們的簽樣Signature不能相同。 函數的簽樣包括名稱、參數型態與參數數目,函數簽樣是電腦認定函數的識別。 函數的名稱相同簽樣不同的情形稱為函數的多重定義overloading。
16
5-2 類別的設計Class Implement
除了公用介面的函數外,還需要與這些函數相關的資料,也就是時、分、秒的時間記錄: int m_hours; int m_mins; int m_secs; 用UML圖表示分析的結果: (物件中變數的存取已透過函數 處理,使用者不能直接引用, 擷取方式定義定為private。)
17
5-2 類別的設計Class Implement
類別的程式設計 預設的建構函數 CTime(){ m_hours=0; m_mins=0; m_secs=0; } CTime myTime = new CTime(); 參數型的建構函數 CTime(int hours, int mins, int secs) { m_hours= hours; m_mins= mins; m_secs= secs; } CTime myTime = new CTime(12,45,30);
18
5-2 類別的設計Class Implement
成員函數 member functions public int getHours(){ return m_hours; } public int getMins(){ return m_mins; } public int getSecs(){ return m_secs; } public void print(){ System.out.print(m_hours+“:”); System.out.print((m_mins<10?”0”:””)+m_mins+“:”); System.out.println((m_secs<10?”0”:””)+m_secs);
19
5-2 類別的設計Class Implement
public boolean setTime(int hours, int mins, int secs){ if (!isValidTime(hours, mins, secs)) // 補助函數 return false; else { m_hours=hours; m_mins=mins; m_secs=secs; return true; } 補助函數 auxiliary function isValidTime(hours, mins, secs)函數是類別內成員函數或建構函數所使用的函數,稱之為補助函數 。
20
5-2 類別的設計Class Implement
補助函數 auxiliary function private boolean isValidTime(int hours,int mins,int secs) { return ( hours >=0 && hours < 24 && mins >= && mins < 60&& secs >= 0 && secs < 60 ); } 因為這個函數只能被成員 函數或建構函數所引用, 不能為物件使用者所引用 ,所以將它的擷取方式定 義設為private。
21
5-2 類別的設計Class Implement
測試程式Testing Driver的設計 程式測試是能測試類別內所有函數的腳本程式。這個腳本沒有一定的標準。 public class CTimetest { public static void main(String[] args) { CTime myTime = new CTime(); CTime yourTime = new CTime(1,30,2); yourTime.print(); myTime.print(); if (myTime.setTime(1,9,2)) }
22
5-3 物件的生命週期 The Life Cycle of an Object
物件產生後就要使用,不用時為避免佔據記憶體就要清除,清除後若再需要使用,就再產生新的物件,如此形成一個物件的生命週期。
23
5-3 物件的生命週期 The Life Cycle of an Object
5-3-1 物件的產生 Creating Objects 物件宣告 Declaration Point Origin; 物件建構 Initialization Origin = new Point(12, 26); 通常物件宣告和建構會寫在同一行: Point Origin = new Point(12, 26);
24
5-3 物件的生命週期 The Life Cycle of an Object
5-3-2 物件的使用 Using Objects 從物件中取得資料 直接存取物件變數資料,如int width=rect_A.width; 執行物件函數,如 int area= rect_A.area(); 只有定義為 public 的變數或函數才能被存取資訊。 public int width; : public int area() { return width*height; }
25
5-3 物件的生命週期 The Life Cycle of an Object
物件參數 Object as a parameter Point Origin = new Point(12, 26); Rectangle Rect_B = new Rectangle(Origin, 60, 100); public Rectangle(Point p, int w, int h){ width=w; height=h; Origin = p; } 物件中物件稱為 Container
26
5-3 物件的生命週期 The Life Cycle of an Object
多重定義 Overloading public Rectangle() { width = 0; height = 0; Origin = new Point(0,0); } public Rectangle(int w, int h) { width=w; height=h; public Rectangle(Point p, int w, int h){ Origin = p;
27
5-3 物件的生命週期 The Life Cycle of an Object
5-3-3 物件的清除 Cleaning Up Unused Objects 將物件變數值設為null,準備給“垃圾收集”程式清除。 Point Origin = new Point(12,26); :(物件使用一段時間) Origin = null; 執行“垃圾收集” (Garbage Collector) 程式 基本上它是自動執行,但程式本身也可呼叫System類別的gc函數強迫執行。如:System.gc();
Similar presentations