方法進階及物件導向基礎 Lecturer: 曾學文.

Slides:



Advertisements
Similar presentations
面向对象程序设计 、. 第二章 面向对象的分析与设计 学习目标 1 确定系统中的对象 2 确定对象的属性及操作 3 测试对象的有效性 4 区分对象和类 5 了解面向对象的编程和过程化编程之间的区别 6 了解封装的主要好处 7 了解软件开发的主要步骤.
Advertisements

第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
Java语言的特点 Java开发环境的搭建
单元二:面向对象程序设计 任务二:借书卡程序设计.
第三讲 面向对象(上).
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
第一章 資料結構導論 1-1 資料結構簡介 1-2 認識程式設計 1-3 演算法效能分析 1-4 物件導向程式設計與Java.
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
第一章 面向对象程序设计.
程設一.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
類別與物件 Class & Object.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Chapter 5 遞迴 資料結構導論 - C語言實作.
程設一.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
Java簡介.
物件導向程式設計 (Object-Oriented rogramming)
JAVA 程式設計與資料結構 第七章 繼承與Interface.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
Classes Lecturer: 曾學文.
CHAPTER 9 建構方法 ROBERT.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
程式設計實作.
第2章回顾 标识符:不用记,动手 关键字:if, else, switch, for, while, do, break, continue, void, …… 局部变量和成员变量 ①变量作用域 ②内存布局 基本数据类型 ①4类8种 ②互相转换 流程控制语句 ①分支 if……else, switch.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
面向对象程序设计 、.
Java程序设计 第9章 继承和多态.
Java
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
Instructor Textbook Requirements TAs C++程式設計風格與藝術 (O’Reilly).
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
Topic Introduction—RMI
第一單元 建立java 程式.
第 19 章 XML記憶體執行模式.
挑戰C++程式語言 ──第8章 進一步談字元與字串
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Interfaces and Packages
OOP9 類別Class.
函數應用(二)與自定函數.
第 9 章 建構函式與解構函式.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
Class 2005/05/25.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
JAVA 程式設計與資料結構 第三章 物件的設計.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第6章 继承和多态 伍孝金
Summary
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

方法進階及物件導向基礎 Lecturer: 曾學文

Outline Overloading 遞迴(Recursive) Your Turn 物件導向概念(OOP) 物件基礎

Overloading Overloading 在 Java 中有三種情況可能會造成 method 在類別中或是 superclass 中和其他的 methods 同名 覆蓋 methods(overriding methods) 遮蔽 methods(hiding methods) 名稱過載(name overloading) Overloading 為類似功能的方法統一提供一樣的名稱,但是可以根據 參數個數的不同 參數資料型態的不同 自動呼叫對應的函式。 (這樣設計員可以不用花很多心思想不同的函式名稱)

Overloading Overloading Java 中,以 method 的名稱與參數來決定一個 method 因此,Java 允許多個 methods 共用同一個名字,但必須擁有不同數目或型態的參數以供區分 例: static int square(int num) static double square(double num) 或 static int getMin(int a, int b) static int getMin(int a, int b, int c)

Overloading Example: OverloadingDemo.java static int square(int num) { return num*num;} static double square(double num) { return num*num; } static int getMin(int a, int b) { if ( a < b ) return a; else return b; } static int getMin(int a, int b, int c) { int min; if ( a < b ) min = a; else min = b; if ( min < c ) return min; else return c;

想想看一個overloading的範例 float squareMeasure(int radius) //圓形面積 { return radius* radius*3.14; } float squareMeasure(int height, int width) //長方形面積 { return height*width; float squareMeasure(int upp, int bot, float height) //梯形面積 { return (upp+bot)*height/2;

多型 (Polymorphism) 同一個介面(方法名稱),多種實際運作方法 設計一個通用的介面給一組相關動作 降低程式分類的複雜性 選擇特定的動作(也就是方法)應用於各種情況是編譯器的工作 程式設計師不需要手動去選擇 只需要記住和使用通用的介面即可

Your Turn 設計一段Code讓以下的Overloading方法 myADD 得以實現 public static void main(String[] args) { int i = 10, j = 5; int k = myADD(i, j); System.out.println("The return value: " + k); int a = 10, b=3; int w = myADD(a, b, 8); System.out.println("The return value: " + w); double y = 10.8, z=3.3; double x = myADD(y, z); System.out.println("The return value: " + x); }

遞迴(Recursive) 遞迴(Recursive) 程式設計的一個重要觀念,可以使程式碼變的很簡潔,但是設計此類方法必須很小心,不然很容易掉入無窮迴圈。 定義:一個問題內涵是由本身所定義的話,稱之遞迴 特性: 遞迴方法每次呼叫後,可使問題範圍縮小 方法必須要有一個終止條件,以便結束遞迴方法的執行

遞迴(Recursive) 遞迴的階層函數: 4! = 4*(4-1)! = 4*3! 3! = 3*2! 2! = 2*1! 1! = 1*0! = 1 2! = 2*1! = 2*1 = 2 3! = 3*2! = 3*2 = 6 4! = 4*3! = 4*6 = 24

遞迴(Recursive) Example: FactorialDemo.java static int factorial(int n) { if ( n == 1 ) return 1; else return n * factorial(n-1); }

遞迴(Recursive) 河內塔(Tower of Hanoi) 每次只能移動一個 且只能一棟最上面 任何盤子可以搬到任何 一根木樁 過程中,必須維持盤子的大小順序

遞迴(Recursive) 歸納出 3 個步驟: 終止條件:n=1 移動次數: 將最上面 n-1 個盤子從木樁 1 搬到木樁 2 將最後一個盤子從木樁 1 搬到木樁 3 將木樁 2 的 n-1 個盤子搬移到木樁 3 終止條件:n=1 移動次數: T(1)=1, T(2)=3, T(3)=7 T(n) = 2T(n-1) + 1

遞迴(Recursive) Example: TowerHanoi.java static void towerofHanoi(int dishs, int peg1, int peg2, int peg3) { if ( dishs == 1 ) { // 終止條件 System.out.println("盤子從" + peg1 + "移到" + peg3); } else { // 第一步驟 towerofHanoi(dishs-1, peg1, peg3, peg2); // 第三步驟 towerofHanoi(dishs-1, peg2, peg1, peg3); }

Your Turn 試遞迴設計 static long fib(int num) 方法來計算某一項的費氏係數 (費氏係數:1, 1, 2, 3, 5, 8, 13, 21, …) 參數 num 為欲計算的項次 提示 fib(1)=1 fib(2)=1 fib(3)=fib(1)+fib(2)=2 fib(4)=fib(3)+fib(2)=3 輸入n,就呼叫fib(n)獲得值

初步檢視類別 class: 用來訂定物件的規格 物件 = 屬性(Attributes) + 動作(Actions) I am a bird. My name is Cathy. 屬性: name, feather, claw, …. 動作: fly, sleep, eat …..

初步檢視類別 //產生物件Cathy void main() { bird Cathy = new bird() ; class bird { private: // data member string name, feather ; int claws ; public: // member functions void fly() {…} void sleep() {…} void eat() {…} } ; //產生物件Cathy void main() { bird Cathy = new bird() ; Cathy.fly() ; Cathy.sleep(); Cathy.eat() ; } 屬性 動作

Object-Oriented Programming (OOP) 類別(Class) 是一個藍圖或是原型(prototype)其中定義了某一種類別所需的狀態(variables)、行為(method)和事件(Event) 狀態(variables):一個物件的特性 (身高,體重,年齡)  物件的名詞 行為(method)或事件(event):一個物件會做的動作 (跑,跳,走路)  物件的動詞

(Object-Oriented Programming) 物件導向程式設計概念 封裝(Encapsulation) 繼承(Inheritance) 多型(Polymorphism)

封裝(Encapsulation) 結合資料(data)與處理函式為一體(物件)。 使用class 使用者不必瞭解物件中的詳細資料結構與函數實作,就可使用該物件 避免外界干擾或誤用內部資料及函式 使用private、protected及public

(封裝) 封裝 使用者: 使用Stack的push與pop功能 Stack (功能規格): push(), pop() Stack 實作一

繼承(Inheritance) 繼承(Inheritance) 一個類別可以繼承他的父類別的狀態以及行為,此時稱為此子類別(subclass)繼承於父類別(superclass) human: name, age, color eat(); sleep(); (繼承) citizen: name, age, color, country, ID eat(); sleep(); payTax(); married() ;

繼承(Inheritance) 繼承 父類別可直接透過繼承產生子類別 子類別延續父類別的功能,並可外加新功能(method) 例如:payTax(); married() ; 子類別也可以覆蓋(override)自父類別而來的功能(method),提供一個自我詮釋方式 例如: eat(); sleep(); 所以它可以覆蓋(override)父類別的原始功能,自己設定一個新的eat(); sleep(); 。

多型(Polymorphism) 編譯時期多型 執行時期多型 同一個函數名稱可以有不同的詮釋 function overloading operator overloading 執行時期多型

Object-Oriented Programming (OOP) 介面(Interface) 定義 一段只有常數與函式宣告,但沒有函式實作的程式碼。 作用 讓某個功能,不論由誰實作,都能夠有相同的函式名稱,傳入值,傳出值,與存取範圍 當某個 class 實作 interface,即代表該 class 會提供此 interface 中所有的 methods 的程式碼

物件基礎(Object Basics) 建立物件三步驟 宣告 Declaration 建構 Instantiation 語法:Class objName; 建構 Instantiation 使用 new 運算子建構新物件,此時將分配空間給此物件 初始化 Initialization 使用 new 運算子的同時,將呼叫類別建構元(constructor) 例01:String str = new String(“Hello World!”); 例02:String str; str = new String(“Hello World!”);

宣告暨實作一個Class的要點 分public和private部分 決定有哪些公開或私有的方法Method 決定有哪些公開或私有的屬性Property 宣告建構元(constructor)初始化類別的所有變數 class Cat { public int Age = 10; //有些屬性是公開的 private String animalType = “feline"; private String catColor; //有些屬性是私有的 Cat(String colorIn) // Cat 類別的建構元 {} public String getCatsColor() //Cat 提供的method {} public String getCatsType() {} }

建構函數與解構函數 建構子函數(constructor functions) 解構子函數(destructor functions) 物件生成時所自動呼叫的成員函數 解構子函數(destructor functions) 物件消滅時所自動呼叫的成員函數 垃圾收集(garbage collection)

物件的生成與消滅 1 int main() { 2 myclass ob1 ; 3 ob1.show() ; 4 fun() ; 5 return 0; 6 } 7 void fun() { 8 myclass ob2; 9 ob2.show() ; 10}

建構子 EX: 將屬於myclass的物件的初始值設為10 建構子(constructor): (1)也是成員函數 (2)與class同名 class myclass { int a ; public: myclass(); // default constructor void show() ; } ; myclass::myclass() { a= 10 ; } void myclass::show() { cout << a<<endl;} int main() { myclass ob = new myclass(); ob.show(); return 0; } 建構子(constructor): (1)也是成員函數 (2)與class同名 (3) 沒有回傳值 (4)可以有很多個 (5)允許傳參數 物件生成時,會呼叫建構子

使用物件 物件單獨宣告時可暫時不需要建構與初始化(未分配記憶體空間);但在使用物件之前,一定得建構與初始化物件 使用物件的方式 -- 物件名稱後面加 . 加成員名稱 實體變數(instance variables) 語法:objName.varName 方法(methods) 語法:objName.methodName(argList) 例如:String s = new String(“Hello World!”); s.length(); // 取出 s 這個字串物件的長度 s.charAt(0); // 取出 s 這個字串物件第一個字元

補充: 系統對物件的清除 物件的清除 在某些物件導向程式語言中,要求當物件無用時,必須明確的將其刪除,否則將持續佔據記憶體空間 Java 程式語言中,會自動偵測無用的物件,並將之刪除,稱為垃圾收集(garbage collection),此機制由垃圾收集器(garbage collector)自動執行 無用的物件可直接指定為 null 語法:objName = null; 手動立即執行記憶體清除:System.gc(); 當物件被清除掉後,它會立刻呼叫物件的 finalize 方法,在大部分情況下,系統會自動處理

產生物件並使用物件 Example: ObjectDemo.java // 產生一個 testObj 物件 Test testObj = new Test(); //建構元 // testObj 提供的 methods testObj.setX(500); testObj.printX(); testObj.printMsg("Java"); testObj.sayHello(); x = testObj.getX(); System.out.println("x = " + x);

Your Turn class Cat { public int Age = 10; private String animalType = “feline"; private String catColor; Cat(String colorIn) // Cat 類別的建構元 { catColor = colorIn; } public String getCatsColor() //Cat 提供的method { return catColor; public String getCatsType() { return animalType; Your Turn 製作一個 Cat 的類別—寫cat.java產生cat.calss 以先前寫程式的習慣製作 CatDisplay.java 在main()方法中存取 Cat 中的屬性以及方法—獲得貓的年齡、顏色、種類並列印出來