Download presentation
Presentation is loading. Please wait.
1
Ch03 方法 物件導向程式設計(II)
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
JAVA程式設計 以[大富翁]為例
24
V4:新增玩家類別中一個方法前進( ),且經過起點時獲得1000元
教學目標:1.學習如何製作類別中的方法 2.不要再將所有動作完全放在 main()中
25
類別:土地 class 土地 { String 地名; } 類別:玩家
int 錢 = 2000; int 位置 = 0; void 前進() 位置 += ((int)(Math.random()*11) + 2); if (位置 >= 40) 位置 -= 40; 錢 += 1000; } return; }
26
類別:大富翁 class 大富翁 { public static void main(String [] args)
"越南", "泰國", "印度", "伊拉克", "伊朗", "沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭", "德國", "奧地利", "瑞士", "法國", "比利時", "荷蘭", "英國", "芬蘭", "瑞典", "丹麥", "希臘", "義大利", "西班牙", "葡萄牙", "埃及", "摩洛哥", "南非", "加拿大", "美國", "墨西哥", "宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ;
27
for(int j = 1; j <= 10; j++) { for(int i = 0; i < P
for(int j = 1; j <= 10; j++) { for(int i = 0; i < P.length; i++) P[i].前進(); System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 錢="+P[i].錢 ); } 土地 L [] = new 土地[40]; for (int i = 0; i < L.length; i++) { L[i] = new 土地(); L[i].地名 = 土地名[i]; System.out.println(L[i].地名); } 玩家 P [] = new 玩家[4]; for (int i = 0; i < P.length; i++) P[i] = new 玩家(); P[0].名字 = "喜羊羊"; P[1].名字 = "美羊羊"; P[2].名字 = "小灰灰"; P[3].名字 = "灰太狼";
28
HW#3 為每一塊地加上屬性過路費,地主,地價
當玩家到一個土地時,如果,土地尚未賣出,而且錢夠,則可以買地;如果土地已經賣出,則要付過路費給地主
29
V5:新增土地類別中一個方法登記土地所有人()及新增玩家類別中一個方法付過路費()
教學目標: 1.學習如何在方法中作傳址呼叫 2.學習如何呼叫物件中的屬性 方法
30
class 玩家 { String 名字; int 錢 = 2000; int 位置 = 0; void 前進() 位置 += ((int)(Math.random()*11) + 2); if (位置 >= 40) 位置 -= 40; 錢 += 1000; } return; void 付過路費(土地 路過此地) 錢 -= 路過此地.過路費; 路過此地.地主.錢 += 路過此地.過路費; System.out.println(名字 + " 要付給 " + 路過此地.地名 + " 的地主 " + 路過此地.地主.名字 + " " + 路過此地.過路費 + " 元 ");
31
class 土地 { String 地名; int 過路費 = 20; int 地價 = 500; 玩家 地主; void 登記土地所有權人(玩家 買地人) if(買地人.錢 >= 地價) { //有錢可以買地 買地人.錢 -= 地價; 地主 = 買地人; System.out.println(買地人.名字 + "買了" + 地名); } else System.out.println(買地人.名字 + "沒有買地"); return;
32
class 大富翁 { public static void main(String [] args) String [] 土地名 = {"中華民國", "日本", "韓國", "菲律賓", "馬來西亞", "越南", "泰國", "印度", "伊拉克", "伊朗", "沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭", "德國", "奧地利", "瑞士", "法國", "比利時", "荷蘭", "英國", "芬蘭", "瑞典", "丹麥", "希臘", "義大利", "西班牙", "葡萄牙", "埃及", "摩洛哥", "南非", "加拿大", "美國", "墨西哥", "宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ; 土地 L [] = new 土地[40]; for (int i = 0; i < L.length; i++) L[i] = new 土地(); L[i].地名 = 土地名[i]; // System.out.println(L[i].地名 + " 地主是 " + L[i].地主.名字); }
33
玩家 P [] = new 玩家[4]; for (int i = 0; i < P
玩家 P [] = new 玩家[4]; for (int i = 0; i < P.length; i++) { P[i] = new 玩家(); } P[0].名字 = "喜羊羊"; P[1].名字 = "美羊羊"; P[2].名字 = "小灰灰"; P[3].名字 = "灰太狼"; for(int j = 1; j <= 10; j++) System.out.println("第 " + j + " 輪 "); System.out.println("目前土地狀態"); for (int k = 0; k < L.length; k++) if( L[k].地主 != null) System.out.println(L[k].地名 + " 地主是 " + L[k].地主.名字); else System.out.println(L[k].地名);
34
for(int i = 0; i < P. length; i++) { P[i]. 前進(); System. out
for(int i = 0; i < P.length; i++) { P[i].前進(); System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢); if(L[P[i].位置].地主 == null) { //買地 System.out.println(L[P[i].位置].地名 + "目前尚未售出"); L[P[i].位置].登記土地所有權人(P[i]); } else { //付過路費 if (L[P[i].位置].地主 != P[i]) P[i].付過路費(L[P[i].位置]);
35
HW#4 練習繪製記憶體中各個物件的關係圖 了解新增的方法程式碼
Similar presentations