Presentation is loading. Please wait.

Presentation is loading. Please wait.

精彩Java 2程式設計 <吳逸賢、吳目誠 編著>

Similar presentations


Presentation on theme: "精彩Java 2程式設計 <吳逸賢、吳目誠 編著>"— Presentation transcript:

1 精彩Java 2程式設計 <吳逸賢、吳目誠 編著>
B1 類別與物件 精彩Java 2程式設計 <吳逸賢、吳目誠 編著>

2 目錄 B1-1 認識類別與物件 B1-2 建立類別 B1-3 巢狀類別 B1-4 物件陣列 B1-5 練習與實作

3 B1-1 認識類別與物件 物件與類別的初體驗 物件的屬性與方法 查閱物件的屬性與方法

4 物件與類別的初體驗: 物件(Object)是物件導向程式語言的基本元件。
類別(Class)是產生物件的模板,不同的模板可以產生不同特性的物件。 字串命令String就是一種類別(class),而利用String類別就可以產生具有String特性的物件。

5 程式碼如下:

6 下面是使用日期類別Date建立d1物件的程式碼:

7 下面是使用整數Integer類別建立v1物件的程式碼:

8 下面是使用倍精確度Double類別建立v2物件的程式碼:

9 物件的屬性與方法: 在物件導向程式語言中,將專屬於物件的函數稱之為方法(Methods)。
專屬於物件的變數稱為屬性(Properties)或稱為範疇(Field)。 當我們建立一個整數物件v1如下: Integer v1=new Integer(95); 則v1物件包含MAX_VALUE、MIN_VALUE、TYPE等三個屬性。

10 測試整數物件屬性的程式碼如下:

11 程式編譯與執行結果如下:

12 物件的屬性與方法的重要事項: 物件和屬性間使用“.”隔開,格式如下: 物件名稱.屬性名稱

13 測試整數物件屬性的程式碼如下:

14 程式編譯與執行結果如下:

15 測試字串物件的方法(method),其程式碼如下:

16 程式編譯與執行結果如下:

17 物件和方法間使用“.”隔開,且在方法名稱後加上“()”括號當結尾,的格式如下:
物件和方法的重要事項: 物件和方法間使用“.”隔開,且在方法名稱後加上“()”括號當結尾,的格式如下: 物件名稱.方法名稱() 有時方法需要傳遞參數,然而使用不同方法所傳回的資料型態也各不相同,此時,必須宣告相同型態的變數來接收傳回值。

18 查閱物件的屬性與方法: Java程式語言具有豐富的類別(class),而每一種類別所產生的物件,都具有各自所屬的方法(method)和屬性(properties)。 Sun的網站有豐富的Java語言相關資訊,包括各類技術文件、程式範例、學習指引、常見問題解答等等。

19 連線到Sun的Java討論區的查詢視窗如下: (http://forum.java.sun.com)

20 查閱到String類別所建立物件可以使用的方法如下:

21 B1-2 建立類別 傳統程式語言的結構 定義一個陽春的類別 包含屬性和方法的類別 建構函數 使用方法傳回變數值 函數成員的覆載與參數傳遞 類別中的靜態變數

22 傳統程式語言的結構: 在傳統程序導向語言中,只能使用結構(struct)命令來定義新的資料型態。

23 以下的C語言程式碼,可以定義新的資料型態posxy,這個資料型態中包含四個整數變數x1、x2、y1、y2:
傳統程式語言的結構的程式碼如下: 以下的C語言程式碼,可以定義新的資料型態posxy,這個資料型態中包含四個整數變數x1、x2、y1、y2: struct posxy { int x1 ; int x2; int y1; int y2; };

24 利用新的資料型態posxy,就可以宣告新變數如下:
宣告新變數: 利用新的資料型態posxy,就可以宣告新變數如下: posxy *a1; a1=new posxy;

25 就可以存取a1變數中的成員,包括x1、x2、y1、y2等,其程式碼如下:
a1->y1=52; a1->y2=356;

26 傳統程序導向語言與物件導向語言的差別: 物件導向語言提供新型的資料型態—類別(class)。 在類別中,不但可以宣告變數成員(屬性),還可以設定處理資料的函數(方法)。

27 對於初學者來說,可以將類別當作結構來使用,進而漸漸熟悉類別。 例如以下的程式碼:
定義一個陽春的類別: 對於初學者來說,可以將類別當作結構來使用,進而漸漸熟悉類別。 例如以下的程式碼: class pos_xy { public int x1; public int x2; public int y1; public int y2; };

28 程式碼說明: 在public區宣告的變數就成為類別的屬性,而利用新的類別pos_xy,就可以宣告新元件如下:
pos_xy obj1= new pos_xy(); 就可以存取物件obj1的屬性,包括x1、x2、y1、y2等,其程式碼如下: obj1.x1=100; //設定物件的x1屬性 obj1.x2=200; //設定物件的x2屬性 obj1.y1=52; //設定物件的y1屬性 obj1.y2=356; //設定物件的y2屬性

29 以下就是定義一個新類別與產生新物件的程式碼舉例:

30 程式編譯與執行結果如下:

31 包含屬性和方法的類別: 完整的類別宣告格式如下: class classname {
private …//私有成員(member),無法從類別外部存取 public …//公有成員(member),任何位置都可以存取 protected …//公有成員(member),同一封包中,任何位置都可以存取 };

32 上述格式中,包括private、public和protected等三種成員,private資料成員或函數:
程式碼說明: 上述格式中,包括private、public和protected等三種成員,private資料成員或函數: private資料成員或函數,外部程式不能直接存取。 public資料成員或函數,任何外部程式可以直接存取。 protected資料成員或函數,在同一封包中,類別外部程式可以直接存取。 public資料成員在建立元件時可以做為屬性,而函數就變成物件的方法。

33 以下就是定義包含屬性與方法的類別程式碼:

34 定義包含屬性與方法的類別程式碼說明: 類別程式碼中,包括x1、x2、y1、y2等四個屬性,也包括addnum_x1和addnum_y1兩個方法。

35 以下是使用pos_xy類別建立物件與操作物件的程式碼:

36 透過方法來存取變數內容而將類別宣告修改如下:

37 以下是使用pos_xy2類別建立物件與操作物件的程式碼:

38 下面是完整的程式碼:

39

40 程式編譯與執行結果如下:

41 建構函數: 建構函數(Constructor Function)是類別資料成員中的特殊函數,它的名稱與類別名稱相同。 當使用類別建立新的物件時,會自動執行建構函數一次,利用這個特性,可以用來設定變數的初值或進行記憶體的配置工作。 建構函數不能傳回值,所以不必宣告函數的型態。 在類別中可以宣告建構函數,名稱必須與類別名稱相同。

42 以下就是在類別中加入建構與解構函數的程式碼:

43 建立含有建構函數的類別後,建立類別的物件程式碼如下:
pos_xy3 obj3=new pos_xy3(20); //呼叫建構函數,設定初值

44 建構函數具有覆載(overload)特性的程式碼如下:

45 上述的類別中,有pos_xy4()和pos_xy4(int a)等兩個建構函數。
程式碼說明: 上述的類別中,有pos_xy4()和pos_xy4(int a)等兩個建構函數。 當建立物件時,沒有傳遞參數,則會使用pos_xy4()建構函數,程式碼如下: pos_xy4 obj4=new pos_xy4(); 若程式碼修改如下: pos_xy4 obj4=new pos_xy4(20); 則會呼叫建構函數pos_xy4(int a)。

46 對於已經建立的物件,只要設定為null,就可以將物件解構,並釋放出記憶體,程式碼如下:
將物件解構: 對於已經建立的物件,只要設定為null,就可以將物件解構,並釋放出記憶體,程式碼如下: obj4=null;

47 使用方法傳回變數值: 若要取得私有變數的值,必須在函數成員中使用return命令。

48 使用方法傳回變數值的類別程式碼:

49 上述程式碼中,使用get_x1()方法傳回的值為50。
程式碼說明: 在上面的類別程式碼中有get_x1()、get_x2()、get_y1()、get_y2()等四個方法可以傳回值,建立物件和傳回值的程式碼如下: pos_xy5 obj5=new pos_xy5(); int a=obj5.get_x1(); //傳回值 System.out.println("屬性x1:"+a); 上述程式碼中,使用get_x1()方法傳回的值為50。

50 函數成員的覆載與參數傳遞: 覆載(overload)是物件導向程式語言的基本特性,類別中的函數成員也可以設計成為具有覆載功能。

51 函數成員的覆載與參數傳遞的程式碼如下:

52 程式碼說明: 在上面的類別程式碼中有兩個相同名稱的函數成員get_x1()。
pos_xy6 obj6=new pos_xy6(); int a=obj6.get_x1(3); System.out.println("屬性x1:"+a); 呼叫get_x1()方法時,傳遞了一個整數值,所以會自動執行get_x1(int a)函數成員,使得傳回值為53。

53 類別中的靜態變數: 類別中資料成員可以宣告成為靜態變數。 含有靜態變數的類別必須獨立於函數之外,就像宣告全域變數時,必須在函數之外宣告一樣。 使用含有靜態變數之類別所建立的物件,彼此可以共同存取同一個靜態變數。

54 設定一個靜態變數來記錄總共產生了多少個物件的程式碼如下:

55 程式碼說明: 在上面的main程式碼中,產生了兩個類別sta的物件,使得靜態變數的值變成2。

56 B1-3 巢狀類別 一般類別與巢狀類別 以建構函數建立內部類別物件 匿名類別

57 一般類別與巢狀類別: 一般類別與巢狀類別(Nested Class)的執行功能並沒有差異,只是表示方法的不同。

58 例如以下的程式碼,類別b1_03_01與類別pos_xy6彼此沒有從屬關係:

59 將類別pos_xy6變成為類別b1_03_01的一個成員的程式碼如下:

60 程式碼說明: 當一個類別是另一個類別的成員時,這個類別就稱為巢狀。也就是說,類別pos_xy6是一個巢狀類別。 類別pos_xy6的型態宣告為static,當巢狀類別沒有宣告為static時,則稱為內部類別(inner class)。

61 以建構函數建立內部類別物件: 前面的程式例中,並沒有建立整個程式類別的物件,也可以將整個程式當作一個類別,而在main()程式中建立整個程式類別的物件。

62 建立整個程式類別的物件,程式改寫如下:

63 程式碼說明: b1_03_02()是類別b1_03_02的建構函數。 在main()程式中建立obj物件時,就會自動呼叫建構函數b1_03_02(),以產生內部類別pos_xy6的物件。 類別pos_xy6與前一小節不同,沒有將型態宣告為static,而這種類別就是前一小節提到的內部類別(inner class)。

64 匿名類別: 不具名稱的內部類別(inner class)就稱之為匿名類別(Anonymous class),或稱為匿名內部類別(Anonymous inner class)。 匿名類別必須繼承一個已經存在的類別,藉由繼承來定義匿名類別的內容。

65 包含匿名類別的程式碼如下:

66 B1-4 物件陣列 物件與自定資料型態 建立物件陣列 物件陣列的排序

67 物件與自定資料型態: 陣列(Array)是指用來表示一群相同型態變數的資料型態,而相同型態的物件也可以使用陣列的方式來表示。

68 如何宣告變數來儲存下面三年甲班第一次月考的國文和數學成績?

69 成績表說明: 上列成績表包含id、name、chinese、math等四個欄位。 id和name兩個欄位必須使用字串變數來儲存。 chinese和math可以使用整數或浮點數變數來儲存。

70 利用陣列技巧宣告如下: String id[]={"A01","A02","A03","A04","A05", "A06","A07","A08", "A09","A10"}; String name[]={"Jack","John","Mary","Sam", "Paul","Mike","Cici","Coco","Bob","Kai"}; int chinese[]={90,85,75,88,95,92,80,90,95,92}; int math[]={95,92,88,79,90,82,83,67,79,94};

71 程式碼說明: 第一位學生的資料分別放在id[0],name[0],chinese[0],math[0]等元素中。 第二位學生的資料分別放在id[1],name[1],chinese[1],math[1]等元素中,以此類推!

72 利用class命令建立一個類別來儲存學生基本資料,如下所示:

73 利用這個類別產生每一位學生的資料物件,產生物件的方式有下列兩種:

74 以下是完整的程式碼:

75

76 程式編譯與執行結果如下:

77 建立物件陣列: 陣列(Array)是指用來表示一群相同型態變數的資料型態,所以用來儲存學生資料的物件,也可以使用陣列方式來表示,以增加程式撰寫的靈活度。 要建立物件陣列,首先要建立物件陣列指標,例如: std_data std[]=new std_data[10]; 接著再分別指定每一個物件指標對應的物件內容,例如: std[0]=new std_data("A01","Jack",90,95);//陣列元素0指向的物件 std[1]=new std_data("A02","John",85,92);//陣列元素1指向的物件

78 以下是完整的程式碼舉例:

79

80 程式編譯與執行結果如下:

81 物件陣列中的內容也可以進行排序(由大到小或由小到大),根據排序的結果交換物件的內容。
物件陣列的排序: 物件陣列中的內容也可以進行排序(由大到小或由小到大),根據排序的結果交換物件的內容。 要交換std[0]和std[1]物件內容,必須使用一個相同型態的物件做為暫存區,下面就是交換std[0]和std[1]物件內容的程式碼: std_data std_ temp; std_temp=std[0]; std[0]=std[1]; std[1]=std_temp;

82 以下就是由大到小排列學生成績的完整程式碼:

83

84

85 程式編譯與執行結果如下:

86 B1-5 練習與實作 三角形面積 矩形的周長和面積 使用密碼查詢餘額 計算存款利息

87 三角形面積: 撰寫一個triangle類別,使用public公有成員宣告base、high變數,建立類別的物件並設定底為12、高為18,計算顯示出三角形面積。 利用上述條件,再撰寫一個使用private私有成員宣告求得三角形面積的程式。

88 問題解析與程式設計: 建立一個triangle類別(class)包含宣告public的變數屬性和計算三角形面積的area()方法。 利用triangle類別建立obj物件,設定obj物件的base、high變數屬性為12和18,即可得知三角形的底和高。 最後呼叫物件的area()方法(method),顯示出三角形的面積。

89 定義類別的方式如下: //定義類別triangle三角形 class triangle { //也可以僅使用int宣告 public int base; //公有成員 public int high; //公有成員 public int area(){ return (base*high)/2; } //方法 };

90 設定obj物件的方式如下: //建立 triangle 類別的物件 triangle obj=new triangle(); obj.base=12;  //設定物件的base屬性 obj.high=18;  //設定物件的high屬性

91 呼叫物件的area()方法(method):
System.out.println("三角形面積:"+obj.area());

92 完整程式碼:

93 使用private私有成員方式來建立類別內的變數屬性:
須透過方法(method)來存取宣告變數的值和設定存取所建立類別的物件。

94 程式的解析如下: 在triangle類別(class)內包含了宣告private的變數屬性、存取宣告變數(set_base、set_high)的方法、計算三角形面積的area()方法。 利用triangle類別建立obj物件,設定obj物件的set_base、set_high方法屬性為12和18,即可得知三角形的底和高。

95 定義triangle類別方式如下: private int base; //私有成員 private int high; //私有成員 public void set_base(int a){ base=a; } //方法 public void set_high(int a){ high=a; } //方法 public int area(){ return (base*high)/2; }//方法

96 建立obj物件的方法如下: //建立 triangle 類別的物件 triangle obj=new triangle(); obj.set_base(12); //設定set_base方法的屬性 obj.set_high(18); //設定set_high方法的屬性

97 矩形的周長和面積: 利用建構函數和傳回變數的兩種方式,撰寫一個rectangle類別,並在建構函數內設定矩形的長12、寬18,分別計算顯示出矩形的周長和面積。

98 問題解析與程式設計: 建立一個rectangle類別(class),並設定屬性length、wide變數為私有成員及計算矩形的周長和面積的方式。 透過rectangle建構函數給予length、wide變數的初值。 使用方法傳回變數值。

99 建立一個rectangle類別(class)的程式碼如下:
private int length; //私有成員 private int wide; //私有成員 public int girth(){ return 2*(length+wide); } //方法 public int area(){ return length*wide; } //方法

100 透過rectangle建構函數給予length、wide變數的初值:
//建構函數 triangle(){ base=12;high=18; }

101 使用方法傳回變數值的程式碼如下: //傳回三角形面積值 int a=obj.area();

102 完整程式碼:

103 使用密碼查詢餘額: 模擬一般提款機的查詢餘額功能,讓使用者輸入密碼(1234)後,即會顯示帳號(A0002)、戶名(John)、存款(581000)等資料,若輸入其他密碼,則顯示密碼錯誤。 請以巢狀類別的方式,建立user_data紀錄使用者資料的類別和建構函數,並宣告id、name、password、money變數屬性。

104 問題解析與程式設計: 建立一個user_data類別(class)包含宣告變數id、name、password、money的屬性,以及建構函數。 建立物件obj儲存放置使用者的id、name、password、money資料。 判斷輸入的密碼是否等於預設的密碼(1234),正確則顯示明細資料,否則顯示密碼錯誤。

105 下列為建構函數的程式碼: user_data(String str1,String str2,String str3, double v1) { id=str1;name=str2;password=str3;money=v1; }

106 建立物件obj放置使用者資料方式如下: //建立obj物件儲存user的資料 user_data obj=new user_data("A00002", "John","1234",581000);

107 判斷輸入的密碼是否等於預設的密碼: if(obj.password.compareTo(key)==0){ System.out.println("帳號:"+obj.id+“ \n戶名:"+obj.name+"\n存款:"+obj.money); }else { System.out.println("密碼錯誤!!"); }

108 完整程式碼:

109

110 計算存款利息: 利用物件陣列的方法記錄下表欄位資料,然後計算一路發銀行的客戶存款利息,設定利率為5%,並顯示出每位客戶的帳號、戶名、金額、利息。 請以巢狀類別的方式,建立cus_deposit紀錄銀行客戶資料的類別,並宣告id、name、money和rate()方法。

111 銀行客戶資料表:

112 問題解析與程式設計: 建立一個cus_deposit類別(class)包含宣告變數id、name、money的屬性和計算利息的rate()方法,以及建構函數。 宣告物件陣列和儲存陣列資料。 透過rate()方法來取得計算利息的值,並顯示陣列資料的內容。

113 下列為宣告計算利息的rate()方法的程式碼:
public double rate(){ return money*0.05; }

114 宣告物件陣列和儲存陣列資料的方式如下: //宣告包含10個物件的物件陣列
cus_deposit cus[]=new cus_deposit[10]; cus[0]=new cus_deposit("A0001","Jack",150000); cus[1]=new cus_deposit("A0002","John",210000); cus[9]=new cus_deposit("A0010","Kai", );

115 透過rate()方法來取得計算利息的值,並顯示陣列資料的內容的程式碼如下:
for(int i=0;i<10;i++){ cus[i].rate(); System.out.println("id="+cus[i].id+"\t name="+cus[i].name+"\t money=“ +cus[i].money+ "\t rate="+cus[i].rate()); }

116 完整程式碼:

117


Download ppt "精彩Java 2程式設計 <吳逸賢、吳目誠 編著>"

Similar presentations


Ads by Google