Download presentation
Presentation is loading. Please wait.
1
Ch10 類別與物件-方法 Java程式設計(2)
2
方法(1) 定義 修飾字、形式參數列和return敘述為非必要。 資料型別和方法名稱為必要。 方法的資料型別必須和回傳值相同。
<修飾字> 資料型別 方法名稱(<形式參數列>) { // 方法中的敘述 <return 回傳值;> } 修飾字、形式參數列和return敘述為非必要。 資料型別和方法名稱為必要。 方法的資料型別必須和回傳值相同。
3
方法(2) 方法的命名規則 一般方法名稱的前面部份會是一個動詞,動詞應全為小寫。 動詞後的字,第一個字母為大寫
若方法是為了設定或取得private屬性,則分別使用「set屬性名稱」和「get屬性名稱」。
4
方法(3) 呼叫方法的語法 參數列的工作是把參數傳給方法。 參數列為選擇性的功能,視方法定義的形式參數列而定。
物件名稱.方法名稱(<參數列>) 參數列的工作是把參數傳給方法。 參數列為選擇性的功能,視方法定義的形式參數列而定。
5
如果,你不想讓一些資料隨便被人更改,或是一些固定值,或是你的生日不變
範例1 class Ch03_01 { public static void main(String [] args) { Date today = new Date(); today.set_day(21); today.set_month(3); today.set_year(2007); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); } class Date { private int day; private int month; private int year; void set_day(int a) { day = a; } void set_month(int a) { month = a; } void set_year(int a) { year = a; } int get_day() { return day; } int get_month() { return month; } int get_year() { return year; } 資訊隱藏 想想,private使用的好時機 如果,你不想讓一些資料隨便被人更改,或是一些固定值,或是你的生日不變 Ch03/Ch03_01.java
6
方法(4) 形式參數式中,以逗號分隔各個形式參數 static修飾方法時,該方法為類別方法 抽象方法沒有實作,無方法主體
public int getArea(int w, int h) { return w*h; } static修飾方法時,該方法為類別方法 抽象方法沒有實作,無方法主體 abstract <修飾字> 資料型別 方法名稱(<形式參數列>);
7
方法的呼叫(1) 呼叫方法時的程式走向
8
方法的呼叫(2) 參數只傳遞數值
9
方法的呼叫(3) 傳值和傳參照 基本型別(boolean、byte、short、int、long、char、float及double)是以傳值的方式回傳。 自訂型別(陣列或物件)是以傳參照的方式回傳資料。
10
方法的型別與回傳值 方法的型別就是回傳值的型別 使用void宣告的方法,返回時不回傳任何值 修飾字 資料型別 方法名稱(形式參數列) {
// 方法中的敘述 return 回傳值; } 使用void宣告的方法,返回時不回傳任何值 return;
11
Today和birthday兩個物件實體是不是同一個?
範例2 class Ch03_02 { public static void main(String [] args) Date2 today = new Date2(); Date2 birthday = new Date2(); birthday = today; today.set_day(21); today.set_month(3); today.set_year(2007); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); System.out.println("today: " + today); System.out.println("birthday: " + birthday); System.out.println("生日是: " + birthday.get_year() + "-" + birthday.get_month() + "-" +birthday.get_day()); } Ch03/ch03_02.java
12
範例2_1訂做另一個真正的today(法一)
class Ch03_02_01 { public static void main(String [] args) Date3 today = new Date3(); Date3 birthday = new Date3(); today.set_day(21); today.set_month(3); today.set_year(2007); birthday.set_day(today.get_day()); birthday.set_month(today.get_month()); birthday.set_year(today.get_year()); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); System.out.println("today: " + today); System.out.println("birthday: " + birthday); System.out.println("生日是: " + birthday.get_year() + "-" + birthday.get_month() + "-" +birthday.get_day()); } Ch03/ch03_02_01.java
13
範例2_2訂做另一個真正的today(法二)—傳參照
class Ch03_02_02 { public static void main(String [] args) Date4 today = new Date4(); Date4 birthday; today.set_day(21); today.set_month(3); today.set_year(2007); birthday = duplicateObj(today); System.out.println("今天的日期是: " + today.get_year() + "-" + today.get_month() + "-" + today.get_day()); System.out.println("today: " + today); System.out.println("birthday: " + birthday); System.out.println("生日是: " + birthday.get_year() + "-" + birthday.get_month() + "-" +birthday.get_day()); } static Date4 duplicateObj(Date4 ori) Date4 b = new Date4(); b.set_day(ori.get_day()); b.set_month(ori.get_month()); b.set_year(ori.get_year()); System.out.println("ori : " + ori); System.out.println("b : " +b); return b; Ch03/ch03_02_02.java
14
活化手、腦練習(1) 建立一個類別,類別內有一個sort方法,它可以將傳入的一個陣列,排序後(由小到大)傳回給另一個陣列
Ch03/Ex03_01.java
15
變數領域(1) 大括弧是變數領域的藩籬 若一個變數於某個區塊內宣告,則區塊內從宣告點以下為變數的領域。 區塊外不為變數的領域。 {
int j=1; } j++; //錯誤,無法識別變數j
16
變數領域(2)
17
變數領域(3) 屬性也稱為欄位變數。 方法內的變數稱為自動變數或區域變數。
自動變數和欄位變數同名是合法的情況,不過兩者若同名,則欄位變數會因為被遮蔽而無法在方法內被「看到」。 欲在方法內看到同名的屬性時,可以使用this 關鍵字,指出使用的是物件本身的屬性。 this.屬性名稱
18
變數領域(4)
19
範例3 class Ch03_03 { int a = 10; public static void main(String [] args) Ch03_03 objA = new Ch03_03(); System.out.println("objA.a = " + objA.a); objA.myMethod(1); } void myMethod( int a) System.out.println("myMethod內的a : " + a); a = this.a; System.out.println("重設a,後myMethod內的a : " + a); System.out.println("myMethod內的this.a : " + this.a); Ch03/Ch_03_03.java
20
方法多載 同一類別中,若定義數個相同名稱的方法,而各方法所需的參數不同時,稱為方法多載(Overloading)。
多載方法是以傳入的參數個數及參數型別做為呼叫的判斷依據。 多載方法的形式參數的個數及型別相同時,為非法定義。 多載的目的是因應不同的傳遞資料,讓方法更有彈性。
21
範例4 class Ch03_04 { public static void main(String [] args)
圓形 大餅 = new 圓形(); 矩形 阿方 = new 矩形(); System.out.println("圓形的面積是 : " + 求面積(大餅)); System.out.println("矩形的面積是 : " + 求面積(阿方)); } static double 求面積(圓形 圓) return (圓.圓周率 * 圓.半徑 * 圓.半徑); static double 求面積(矩形 矩) return (矩.長度 * 矩.length); class 圓形 final double 圓周率 = 3.14; double 半徑 = 2; class 矩形 double 長度 = 2; double length = 1; 範例4 C03/C03_04.java
22
活化手腦練習(2) 建立多載方法myAdd,依照傳入的不同資料型別的資料作加的動作。
資料型別包括:int, float, double, String Ch03/Ex03_02.java
23
建構子 使用new及建構子建立物件 物件名稱 = new 類別名稱(); 呼叫建構子
24
預設的建構子 沒有定義建構子的類別時,編譯器會自動設給一個沒有形式參數的建構子。 預設的建構子是沒有內容的,不會對物件的屬性有任何影影響。
定義類別時,若有定義任何建構子,則編譯器不會設給預設建構子
25
定義建構子(1) 建構子的名稱一律同類別名稱,而且不宣告回傳資料型別。
建構子的修飾字可以為public、protected、private或無修飾字。 建構子修飾字不使用static和abstract。 修飾字 類別名稱(形式參數列) { //程式敘述 }
26
定義建構子(2) 建構子也可以多載 class SomeClass { public SomeClass() //不使用參數建立物件 }
public SomeClass(int x, int y) //使用參數建立物件
27
建構子的呼叫(1) 建立物件時呼叫建構子 方法可以和建構子同名。有回傳型別者為方法;反之,無回傳型別者為建構子。
類別名稱 物件名稱 = new 類別名稱(形式參數列);
28
範例5:呼叫多載建構子 class Ch03_05 { public static void main(String [] args)
Rectangle rect1 = new Rectangle(); System.out.println("rect1的面積為:" + rect1.getArea()); Rectangle rect2 = new Rectangle(3,4); System.out.println("rect2的面積為:" + rect2.getArea()); } class Rectangle int height; int width; Rectangle() { height = 1; width = 1; Rectangle(int height, int width) { this.height = height; this.width = width; int getArea() { return height * width; Ch03/Ch03_05.java
29
範例5:呼叫多載建構子(static) 結果??? class Ch03_05_01 {
public static void main(String [] args) Rectangle1 rect1 = new Rectangle1(); System.out.println("rect1的面積為:" + rect1.getArea()); Rectangle1 rect2 = new Rectangle1(3,4); System.out.println("rect2的面積為:" + rect2.getArea()); } class Rectangle1 static int height; static int width; Rectangle1() { height = 1; width = 1; Rectangle1(int height, int width) { this.height = height; this.width = width; int getArea() { return height * width; 結果??? Ch03/Ch03_05_01.java
30
建構子的呼叫(2) 使用this():建構子多載時,建構子呼叫其它建構子的限制: 必須使用 this() 取代類別名稱()。
只能在第一個敘述呼叫。 不能造成建構子遞迴。
31
範例6:利用this()呼叫多載建構子 class Ch03_06
{ public static void main(String [] args) { System.out.println("call Date06() 結果:"); new Date06(); System.out.println("call Date06(2007) 結果:"); new Date06(2007); System.out.println("call Date06(2007,3) 結果:"); new Date06(2007,3); System.out.println("call Date06(2007,3,28) 結果:"); new Date06(2007,3,28); } class Date06 { private int day; private int month; private int year; Date06(int year, int month, int day) { this.year = year; this.month = month; this.day = day; showDate(); } Date06(int year, int month) { this(year, month, 28); } Date06(int year) { this(year, 3,28); } Date06() { this(2007, 3, 28); } void showDate() { System.out.println(year + "-" + month + "-" + day); } Ch03/Ch03_06.java
32
範例7:建立客戶資料(1) 系統需求 建立客戶資料 顯示客戶資料 客戶編號(id) 等級(rank) 生日(birthday)
Customer Int id Char rank Date birthday showData
33
範例7:建立客戶資料(2) Class Ch03_07 class Ch03_07
{ public static void main(String [] args) { new Customer(1, 'H' , 3, 28, 2007); new Customer(2, 'L', 3, 29, 2007); } Class Date07 class Date07 { private int year; private int month; private int day; Date07(int year, int month, int day) { this.year = year; this.month = month; this.day = day; String showDate() { return (year +"-" + month + "-" +day); } Class Customer class Customer { private int id; private char rank; private Date07 birthday; Customer(int id, char r, int m, int d, int y) this.id = id; rank = r; birthday = new Date07(y, m, d); showData(); } void showData() System.out.println("[客戶資料]=========="); System.out.println("編號: " + id); System.out.println("等級: " + rank); System.out.println("生日: " + birthday.showDate()); Ch03/Ch03_07.java
34
範例7:建立客戶資料(3)
35
範例8:建立班級學生資料(1) 系統需求: 建立學生資料 顯示學生資料、班上學生數、導師 學號(id) 操行成績(score)
導師(tecaherNo) 班上學生數(count) 顯示學生資料、班上學生數、導師 Student Int id Double score String teacherNo Int count Print Student() getStudentCount
36
範例8:建立班級學生資料(2) Class Ch03_08 class Ch03_08
{ public static void main(String [] args) { Student std1 = new Student(1, 68.0); System.out.println("學生1號: "); std1.printStudent(); Student std2 = new Student(2, 77.0); System.out.println("學生2號: "); std2.printStudent(); System.out.println("============"); System.out.println("學生人數: " + Student.getStudentCount()); System.out.println("導師: " + Student.teacherNo); System.out.println("將導師換成wang"); Student.teacherNo = "wang"; } Class Student class Student { int id; double score; static String teacherNo = "王大瑾"; static int count; Student(int id, double s) { this.id = id; score = s; count++; } static int getStudentCount() { return count; } void printStudent() System.out.println("學號: " + id); System.out.println("操行成績: " + score);
37
範例8:建立班級學生資料(3)
38
動動腦時間(1) class Ch03_08 { public static void main(String [] args)
{ Student std1 = new Student(1, 68.0); System.out.println("學生1號: "); std1.printStudent(); Student std2 = new Student(2, 77.0); System.out.println("學生2號: "); std2.printStudent(); System.out.println("============"); System.out.println("學生人數: " + Student.getStudentCount()); System.out.println("導師: " + Student.teacherNo); System.out.println("將導師換成wang"); std1.teacherNo = "wang"; } 可以嗎?why? Ch03/Ch03_08_01.java
39
動動腦時間(2) 如何做出物件陣列?? class Ch03_08_02 {
public static void main(String [] args) Student [] std = new Student[2]; System.out.println("學生1號: "); std[0] = new Student(1, 68.0); std[0].printStudent(); System.out.println("學生2號: "); std[1] = new Student(2, 77.0); std[1].printStudent(); System.out.println("====================="); System.out.println("學生人數: " + Student.getStudentCount()); System.out.println("導師: " + Student.teacherNo); } Ch03/Ch03_08_02.java
40
活化手腦練習(3) 製作一個Box類別,這是一個盒子的類別,繪出Box類別的UML類別圖及實作它:
成員變數:width、height和length儲存寬、高和長 建構子:Box(double width, double height、double length) 成員方法:double volume()計算體積、double area()計算表面積 測試物件box1(3.0, 4.0, 5.0) Ch03/Ex03_03.java
41
活化手腦練習(4) 修改範例8程式 學號為流水號從1開始,依物件建立順序自動設定 修改Student類別,成為一個可鏈結的類別
新增一個屬性next。上一個建立的物件之next會指向新的物件來形成鏈結。 定義一個類別方法listStudent,可以列出所有鏈結的物件屬性(id 及score) 要有兩個類別屬性,分別指向第一個物件和最後一個物件
Similar presentations