220 likes | 371 Views
Ch02 方法. 物件導向程式設計 (2). 方法 (1). 定義 <修飾字> 資料型別 方法名稱 ( <形式參數列> ) { // 方法中的敘述 <return 回傳值;> } 修飾字 、 形式參數列 和 return 敘述 為非必要。 資料型別 和 方法名稱 為必要。 方法的資料型別 必須和 回傳值 相同。. 方法 (2). 方法的命名規則 一般方法名稱的前面部份會是一個動詞,動詞應全為小寫。 動詞後的字,第一個字母為大寫 若方法是為了設定或取得 private 屬性,則分別使用「 set 屬性名稱」和「 get 屬性名稱」。.
E N D
Ch02 方法 物件導向程式設計(2)
方法(1) • 定義 <修飾字>資料型別方法名稱(<形式參數列>) { // 方法中的敘述 <return 回傳值;> } • 修飾字、形式參數列和return敘述為非必要。 • 資料型別和方法名稱為必要。 • 方法的資料型別必須和回傳值相同。
方法(2) • 方法的命名規則 • 一般方法名稱的前面部份會是一個動詞,動詞應全為小寫。 • 動詞後的字,第一個字母為大寫 • 若方法是為了設定或取得private屬性,則分別使用「set屬性名稱」和「get屬性名稱」。
方法(3) • 呼叫方法的語法 物件名稱.方法名稱(<參數列>) • 參數列的工作是把參數傳給方法。 • 參數列為選擇性的功能,視方法定義的形式參數列而定。
範例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使用的好時機 如果,你不想讓一些資料隨便被人更改,或是一些固定值,或是你的生日不變
方法(4) • 形式參數式中,以逗號分隔各個形式參數 public int getArea(int w, int h) { return w*h; } • static修飾方法時,該方法為類別方法 • 抽象方法沒有實作,無方法主體 abstract <修飾字> 資料型別 方法名稱(<形式參數列>);
方法的呼叫(1) • 呼叫方法時的程式走向
方法的呼叫(2) • 參數只傳遞數值
方法的呼叫(3) • 傳值和傳參照 • 基本型別(boolean、byte、short、int、long、char、float及double)是以傳值的方式回傳。 • 自訂型別(陣列或物件)是以傳參照的方式回傳資料。
方法的型別與回傳值 • 方法的型別就是回傳值的型別 修飾字資料型別方法名稱(形式參數列) { // 方法中的敘述 return 回傳值; } • 使用void宣告的方法,返回時不回傳任何值 return;
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()); • } • }
範例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()); • } • }
範例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; • } • }
活化手、腦練習(1) • 建立一個類別,類別內有一個sort方法,它可以將傳入的一個陣列,排序後(由小到大)傳回給另一個陣列
變數領域(1) • 大括弧是變數領域的藩籬 • 若一個變數於某個區塊內宣告,則區塊內從宣告點以下為變數的領域。 • 區塊外不為變數的領域。 { int j=1; } j++; //錯誤,無法識別變數j
變數領域(3) • 屬性也稱為欄位變數。 • 方法內的變數稱為自動變數或區域變數。 • 自動變數和欄位變數同名是合法的情況,不過兩者若同名,則欄位變數會因為被遮蔽而無法在方法內被「看到」。 • 欲在方法內看到同名的屬性時,可以使用this關鍵字,指出使用的是物件本身的屬性。 this.屬性名稱
範例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); • } • }
方法多載 • 同一類別中,若定義數個相同名稱的方法,而各方法所需的參數不同時,稱為方法多載(Overloading)。 • 多載方法是以傳入的參數個數及參數型別做為呼叫的判斷依據。 • 多載方法的形式參數的個數及型別相同時,為非法定義。 • 多載的目的是因應不同的傳遞資料,讓方法更有彈性。
範例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; • }
活化手腦練習(2) • 建立多載方法myAdd,依照傳入的不同資料型別的資料作加的動作。 • 資料型別包括:int, float, double, String