5 物件導向程式設計 Object Oriented Programming

Slides:



Advertisements
Similar presentations
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
Advertisements

JAVA 编 程 技 术 主编 贾振华 2010年1月.
第 9 章 物件的建構.
第一單元 建立java 程式.
第6章 類別與物件 – 封裝 6-1 物件導向的基礎 6-2 Java的類別與物件 – 封裝 6-3 類別的建構子
<<會計資訊系統課程講義>> 統一塑模語言(UML)語法精要 -- 物件導向概念、需求分析及系統分析
大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
四資二甲 第三週作業 物件導向程式設計.
第一章 面向对象程序设计.
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
類別與物件 Class & Object.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
Java簡介.
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
物件導向程式設計 (Object-Oriented rogramming)
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Classes Lecturer: 曾學文.
CHAPTER 9 建構方法 ROBERT.
單元3:軟體設計 3-2 順序圖(Sequence Diagrams)
Ch10 類別與物件-方法 Java程式設計(2).
程式設計實作.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
面向对象程序设计 、.
第4章 物件導向分析與設計簡介 4-1 物件導向的軟體系統開發 4-2 物件導向分析與設計 4-3 UML的物件導向分析與設計
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
程式設計(二) 進階類別 郭文真 Sabrina Kuo.
Java
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
類別與物件 I (Classes and Objects I)
第一單元 建立java 程式.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第 19 章 XML記憶體執行模式.
微積分網路教學課程 應用統計學系 周 章.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
樣版.
Object-Oriented Programming in C++ 第二章 类和对象
第二章 Java语法基础.
OOP9 類別Class.
MiRanda Java Interface v1.0的使用方法
函數應用(二)與自定函數.
陣列與結構.
Chapter 15 檔案存取 LabVIEW中的檔案存取函數也可將程式中的資料儲存成Excel或Word檔。只要將欲存取的檔案路徑位址透過LabVIEW中的路徑元件告訴檔案存取函數後,LabVIEW便可將資料存成Excel或Word檔;當然也可以將Excel或Word檔的資料讀入LabVIEW的程式中。
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
JAVA 程式設計與資料結構 第三章 物件的設計.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
NFC (近場通訊, Near Field Communication) 靜宜大學資管系 楊子青
Chapter 4 Multi-Threads (多執行緒).
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

5 物件導向程式設計 Object Oriented Programming 5-1 物件導向程式的設計觀念 (OOP Concepts) 5-2 類別的設計 (Class Implementation) 5-3 物件的生命週期 (The Life Cycle of an Object)

5-1 物件導向程式的設計觀念 程式設計方法的演變 5-1-1 何謂物件 Object? 我們生活四周存在著許多的“物件”,如有形物件的汽車、微波爐等,和無形物件的銀行帳戶、學生成績等。 軟體上的物件是一組變數及其相關函數(或稱方法method)所組成的軟體單位。

5-1 物件導向程式的設計觀念 變數是記錄物件的狀態(或稱屬性properties),函數是描述物件的行為(或稱功能functions)。 如下圖是一個描述汽車的軟體物件。

5-1 物件導向程式的設計觀念 5-1-2 何謂訊息 Message? 當物件A要執行物件B內的函數時,物件A所丟出來的資訊就是訊息。 訊息內容必須包括執行者(那個物件)、執行什麼(物件內那個函數)以及函數執行所需要的資料。

5-1 物件導向程式的設計觀念 5-1-3 何謂類別 Class? 汽車是根據汽車藍圖(Blueprint)製造出來,物件也是根據它的藍圖所產生,而類別就是據以產生物件的藍圖,它描述物件內所有的變數及函數。如前述汽車的類別:

5-1 物件導向程式的設計觀念 一張汽車藍圖可以製造出許多同款的汽車,一個類別可以產生任何數量的物件。 相同類別的不同物件,有著相同的函數,所以一個執行函數的訊息,要指明是那個物件的那個函數。另外變數也是各有一套,分別記錄物件各自的狀態。  

5-1 物件導向程式的設計觀念 5-1-4 何謂封裝 Encapsulation ? 封裝的目的是讓使用者不需知道物件內部是如何運作,就能透過操作介面,完成使用的目的,如日常生活的微波爐。 軟體上所謂的封裝是指將軟體中的變數及使用變數的函數封裝在一起成為一個物件,並依需要設定為多重的控管等級。

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;

5-2 類別的設計Class Implement 定義類別標題 public class 類別名稱 { } 如 public class Car { } 定義類別變數與函數 擷取方式定義 (static) 變數型態 變數名稱; 擷取方式定義 (static) 回應值型態 函數名稱(函數參數); 如 private int currentSpeed; public void changeGear(int GearNo) { }

5-2 類別的設計Class Implement 擷取方式定義access modifiers 又稱能見度定義visibility modifiers或擷取等級access level "public",意指物件的使用者可以讀取這些變數或執行這些函數。如果不要物件的使用者讀取這些變數或執行這些函數,將擷取方式定義設為"private"或”protected”。 當類別中的變數或函數限制於本身或繼承才能使用時,則可定義為protected。    

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; }

5-2 類別的設計Class Implement 5-2-2 UML(Unified Modeling Language )在JAVA的使用 如汽車類別的UML寫成: 第一格表類別名稱,第二格描述變數,第三格描述函數。 "+" 表該變數或函數為public,"-" 表該變數或函數為private。 “()” 裡面表輸入的變數名稱與型態。 ":" 後面表輸出的資料型態。

5-2 類別的設計Class Implement 5-2-3 Time Class 的範例 假設我們要寫個程式記錄徑賽選手 的成績 首先我們想:物件的使用者對這個CTime物件會有那些動作要求? 設定時間 讀取時間,細分為時、分、秒的讀取 顯示時間

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);

5-2 類別的設計Class Implement 建構函數 (Construtor) 建構函數是類別內的一個成員函數,當宣告類別的物件時它會自動執行。建構函數是用來設定物件的初始狀態。 建構函數有一些特別規定: 函數名稱必須與類別名稱相同 它沒有回應值,也不必設定void 可有多個建構函數,當然它們的函數名稱都必須與類別名稱一樣,但它們的簽樣Signature不能相同。 函數的簽樣包括名稱、參數型態與參數數目,函數簽樣是電腦認定函數的識別。 函數的名稱相同簽樣不同的情形稱為函數的多重定義overloading。

5-2 類別的設計Class Implement 除了公用介面的函數外,還需要與這些函數相關的資料,也就是時、分、秒的時間記錄: int m_hours; int m_mins; int m_secs; 用UML圖表示分析的結果: (物件中變數的存取已透過函數 處理,使用者不能直接引用, 擷取方式定義定為private。)

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);

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);  

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)函數是類別內成員函數或建構函數所使用的函數,稱之為補助函數 。

5-2 類別的設計Class Implement 補助函數 auxiliary function private boolean isValidTime(int hours,int mins,int secs) { return ( hours >=0 && hours < 24 && mins >= 0 && mins < 60&& secs >= 0 && secs < 60 ); } 因為這個函數只能被成員 函數或建構函數所引用, 不能為物件使用者所引用 ,所以將它的擷取方式定 義設為private。

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)) }

5-3 物件的生命週期 The Life Cycle of an Object 物件產生後就要使用,不用時為避免佔據記憶體就要清除,清除後若再需要使用,就再產生新的物件,如此形成一個物件的生命週期。

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);

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; }

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

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;

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();