Download presentation
Presentation is loading. Please wait.
Published byJulie Bell Modified over 9 years ago
1
Chapter 8 A Second Look at Classes and Objects
2
SECTION 8.1 STATIC CLASS MEMBERS RoomAreas.java ( 課本 p. 372) Rectangle.java ( 課本 p. 366)
3
main Rectangle kitchen = new Rectangle (); // line 17 物件區 number totalArea input kitchen bedroom den length width
4
main Rectangle bedroom = new Rectangle (); // line 18 物件區 length width number totalArea input kitchen bedroom den length width
5
main Rectangle den = new Rectangle (); // line 19 物件區 length width number totalArea input kitchen bedroom den length width length width
6
main kitchen.setWidth(number); // line 29 物件區 10.0length 14.0width 14.0number totalArea input kitchen bedroom den length width length width Double parse Doubl e “14” setWidth 14.0 每個物件有自己的欄位 方法只作用在「某個物件」的欄位
7
main bedroom.setLength(number); // line 35 物件區 10.0length 14.0width 14.0number totalArea input kitchen bedroom den 15.0length width length width Double parse Doubl e “14” 15.0 setLength 每個物件有自己的欄位 方法只作用在「某個物件」的欄位
8
main totalArea = kitchen.getArea() + bedroom.getArea() + den.getArea(); // line 52-53 物件區 10.0length 14.0width 30.0number totalArea input kitchen bedroom den 15.0length 12.0width 20.0length 30.0width “30” getArea 140.0 getArea 180.0 600.0
9
main totalArea = kitchen.getArea() + bedroom.getArea() + den.getArea(); // line 52-53 物件區 10.0length 14.0width 30.0number 920.0totalArea input kitchen bedroom den 15.0length 12.0width 20.0length 30.0width “30” getArea 140.0 getArea 180.0 600.0 + +
10
問題討論 新題目 – 條件 1: 程式必須印出長方形的個數 – 條件 2: 由 Rectangle.java 提供計數功能 Open – Labs\RoomAreas.java – Labs\RectangleOld.java Alice’s 解決方法 – // Alice: in RoomAreas.java – 符合條件 1 Bob’s 解決方法 – // Bob: in two java files – 符合條件 1 & 2?
11
Non-static vs. Static Why Bob fails? – See ppt. 12 – 物件欄位:每個物件均有一份欄位 物件方法兩特點 ( 課本 p. 522) – Compile Lab8_0.java – Compile Lab8_0_1.java – Ex: length() in String class; getAge() in Dog class Bob 應該使用 static – 修改程式 – See ppt. 13-17
12
main Bob 的方法 物件區 10.0 length width setLe ngth number totalArea input kitchen bedroom den 1count 15.0 length width 1count 20.0 length width 1count setLe ngth getC ount 1
13
main 正確的方法 —static 的使用 static private int count; 物件區 number totalArea input kitchen bedroom den 0 count length width length width length width 屬於整個 Rectangle 類別
14
main 正確的方法 —static 的使用 kitchen.setLength(number); 物件區 number totalArea input kitchen bedroom den 1count length width length width 10.0 length width
15
main 正確的方法 —static 的使用 bedroom.setLength(number); 物件區 number totalArea input kitchen bedroom den 2count length width 15.0 length width 10.0 length width
16
main 正確的方法 —static 的使用 den.setLength(number); 物件區 number totalArea input kitchen bedroom den 3count 20.0 length width 15.0 length width 10.0 length width
17
main 正確的設計 —static 的使用 kitchen.getCount() 物件區 number totalArea input kitchen bedroom den 3count 20.0 length width 15.0 length width 10.0length width getC ount 3
18
Static 靜態欄位特性 (p. 522) – Run Lab8_1.java 靜態欄位特性 (p. 522) – Run Lab8_1_1.java Run Countable.java (p. 522) & StaticDemo.java (p. 523) – 修改 StaticDemo.java (#19) object1 object3 object1 Countable
19
Static Method 靜態方法:加上 static – Countable.java getInstanceCount 改為靜態方法 – StaticDemo.java: 修改 #19 用途 – 工具型類別提供服務 Run Metric.java (p. 525) & MetricDemo.java (p. 526) See ppt. 20-4 – 操作靜態欄位 RectangleOld.java: static getCount() 2count 10.0 length width 靜態方法限制 – Compile Lab8_2.java, Lab8_2_1.java, Lab8_2_2.java, Lab8_2_3.java 10.0 length width Rectangle 類別
20
METRIC.JAVA & METRICDEMO.JAVA ( 課本 pp. 567-8)
21
main Line 17 (MetricDemo.java, p. 526) DecimalFormat fmt = new DecimalFormat("0.00"); 物件區 input miles kilos fmt Show Mess ageDi alog ShowI nputD ialog JOptionPane class mToKkToM Metric class Double class Decimal Format class “0.00” Decima lFormat for mat parse Doub le
22
main Line 21 (MetricDemo.java) 物件區 input miles kilos fmt Show Messa geDial og ShowI nputD ialog JOptionPane class mToKkToM Metric class Double class Decimal Format class “0.00” Decimal Format format “10” parse Doubl e
23
main Line 23 (MetricDemo.java) miles = Double.parseDouble(input); 物件區 input 10.0 miles kilos fmt Show Messa geDial og ShowI nputD ialog JOptionPane class mToKkToM Metric class Double class Decimal Format class “0.00” Decimal Format format “10” parse Doubl e
24
main Line 26 (MetricDemo.java) kilos = Metric.milesToKilometers(miles); 物件區 input 10.0 miles 16.09 kilos fmt Show Messa geDial og ShowI nputD ialog JOptionPane class mToKkToM Metric class Double class Decimal Format class “0.00” Decimal Format format “10” parse Doubl e 10.0
25
Static 效果 2count 10.0 length 4 weight 10.0 length 2 weight amanda In main – Dog.length // 哪個 ? – amanda.length // – Dog.count // – amanda.count // bob Dog main
26
Static 效果 2count 10.0 length 4 weight 10.0 length 2 weight amanda In M1 – length 執行哪個 M1 ,就用哪 個 length – count 就是靜態欄位 count 只有一個 bob Dog M1 M1M1
27
Static 效果 2count 10.0 length 4 weight 10.0 length 2 weight amanda In M2 – length 用哪個 length? – count 就是靜態欄位 count 只有一個 bob Dog M2
28
SECTION 8.4 THE TOSTRING METHOD (p. 533)
29
toString Run Lab8_3.java String toString() – 回傳物件狀態的標準方法 – UML: See Figure 8-8 (p. 534) – 執行時機 ( 課本 p. 536) Run Stock Class Phase 1 \Stock.java (p. 535) & StockDemo1.java (p. 537) 課堂實作 – 請將 Lab8_3.java 中的 Dog 類別增添 toString 功能 – 請用「狗狗姓名 + “@” + 狗狗年齡」代表物件字串
30
SECTION 8.5 WRITING AN EQUALS METHOD (p. 537)
31
比較物件 Run Labs\BadStockCompare.java & Stock.java 利用 == 運算子比較 – See ppt. 32-4 – 比較物件的記憶體位置 比較物件的欄位內容 boolean equals(Stock o) – Run Stock Class Phase 2\StockCompare.java (p. 539) – See ppt. 36-8 – 比較邏輯 ( 課本 p. ?)
32
main Stock company1 = new Stock("XYZ", 9.62); // line 12 物件區 company1 company2 symbol 5 9.62 sharePrice “XYZ”
33
main Stock company2 = new Stock("XYZ", 9.62); // line 13 物件區 company1 company2 symbol 5 9.62 sharePrice “XYZ” symbol 5 9.62 sharePrice “XYZ”
34
main if (company1 == company2) // line 17 物件區 company1 company2 symbol 5 9.62 sharePrice “XYZ” symbol 5 9.62 sharePrice “XYZ”
35
STOCKCOMPARE.JAVA (p. 539)
36
main if (company1.equals(company2)) // line 15 物件區 company1 company2 symbol 4 9.62 sharePrice “XYZ” symbol 5 9.62 sharePrice “XYZ” equals 主程式之所以知道要呼叫 company1.equals(company2) ,是因為: (1)company1 與 company2 都屬於 Stock 類別 (2)Stock 類別提供了 equals 方法可供比較 類別設計者為何寫 equals(Stock object2) : (1) 提供比較服務 (2) 傳入另一物件與方法所啟動的物件做比較
37
main if (symbol.equals(object2.symbol) && // line 73 of Stock.java 物件區 company1 company2 symbol 4 9.62 sharePrice “XYZ” symbol 5 9.62 sharePrice “XYZ” equ als object2 status 在這個當下 (line 73 of Stock.java) ,請問程式可 以存取哪幾區的記憶體? (A)company1 in main() (B) 上方物件的 symbol 欄位 (C) 下方物件的 symbol 欄位 (D)object2 in equals()
38
main sharePrice == object2.sharePrice // line 74 物件區 company1 company2 symbol 4 9.62 sharePrice “XYZ” symbol 5 9.62 sharePrice “XYZ” equ als object2 status
39
課堂實作 Do Algorithm Workbench 1 (pp. 577-8) – toString: 傳回半徑與面積 – equals: 面積相同則代表相同 Open Labs\CircleDemo.java 解答: LabAnswers\CircleDemo_ans.java
40
SECTION 8.8 THE THIS REFERENCE VARIABLE (p. 556)
41
main this 物件區 company1 company2 symbol 9.62 sharePrice “XYZ” this 5
42
可用於所有 non-static 方法中 – 試著在 Stock.java 中 #73, #74 加上 this if (this.symbol.equals(object2.symbol) && – 如果這樣呢 ? if (this.symbol.equals(this.object2.symbol) && 常見用法 – 避免遮蔽效應 (p. 557) Run Lab8_4.java – 呼叫建構式 (p. 558) Run Lab8_5.java 相關限制 ( 課本 p. 558) Compile Lab8_6b.java, Lab8_6a.java
43
8.7 AGGREGATION (P. 543) 到目前為止,我們自己寫的類別,都是用來修飾區域變數的型態 …
44
課本 p. 551
45
Aggregation Read Instructor.java ( 課本 p. 544) – 建構式的兩種不同寫法 Read TextBook.java ( 課本 p. 546) Read Course.java ( 課本 p. 548) – 建構式 instructor = new Instructor(instr); (#27 @Course.java) textBook = new TextBook(text); (#31 @Course.java) – getInstructor() return new Instructor(instructor); (#53 @Course.java) – toString(): 4 個 \n 符號為何印出 9 行 ? Read CourseDemo.java ( 課本 p. 550)
46
main Course myCourse = new Course("Intro to Java", myInstructor, // #20 @CourseDemo.java (p. 550) myTextBook); myInstructor myTextBook 4 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” myCourse courseName 4 instructor textBook Course
47
(String, Instructor, TextBook) Course myCourse = new Course("Intro to Java", myInstructor, myTextBook); "Intro to Java” name instr 4 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” text courseName 4 instructor textBook Course
48
(String, Instructor, TextBook) courseName = name; "Intro to Java” name instr 4 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” text "Intro to Java” courseName 4 instructor textBook Course
49
(String, Instructor, TextBook) instructor = new Instructor(instr); "Intro to Java” name instr 3 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” text "Intro to Java” courseName 4 instructor textBook Course Instruc tor 3
50
Instructor (Instructor) lastName = object2.lastName; firstName = object2.firstName; officeNumber = object2.officeNumber; object2 3 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” "Intro to Java” courseName 4 instructor textBook Course Instruc tor 3 “Kramer” “Shawn” “RH3010” Instruc tor
51
Instructor (Instructor) } object2 3 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” "Intro to Java” courseName 4 instructor textBook Course Instruc tor 3 “Kramer” “Shawn” “RH3010” Instruc tor Return to …
52
Course (String, Instructor, TextBook) instructor = new Instructor(instr); // #27 (p. 548) "Intro to Java” name instr 4 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” text "Intro to Java” courseName 4 instructor textBook Course 3 “Kramer” “Shawn” “RH3010” Instruc tor
53
Course (String, Instructor, TextBook) textBook = new TextBook(text); // #31 (p. 548) "Intro to Java” name instr 4 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” text "Intro to Java” courseName 4 instructor textBook 4 “Kramer” “Shawn” “RH3010” “Starting…” “Gaddis” “Addison…” 4 Course
54
(String, Instructor, TextBook) } // #32 (p. 548) "Intro to Java” name instr 4 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” text "Intro to Java” courseName 4 instructor textBook 4 “Kramer” “Shawn” “RH3010” “Starting…” “Gaddis” “Addison…” 4 Return to … main Course
55
main Course myCourse = // #19 (p. 550) new Course("Intro to Java", myInstructor, myTextBook); myInstructor myTextBook 4 “Kramer” “Shawn” “RH3010” 4 “Starting…” “Gaddis” “Addison…” myCourse 4 “Kramer” “Shawn” “RH3010” “Starting…” “Gaddis” “Addison…” 4 "Intro to Java” courseName 5 instructor textBook
56
Aggregation Run Lab8_7.java – 請注意 #25 – myInstructor 與 myCourse 所包含的 instructor 是同 一物件 ?
57
課堂實作 續 Lab8_7.java 請修改 Course.java 的某一行 讓輸出結果改成: 解答請見 LabAnswers\Course_ans.java
58
課堂實作 Open Mate\Dog.java, Cat.java, MateDemo.java, Mate.java 狗狗跟貓咪可以配成好友 (Mate) 已知 MateDemo.java 執行後印出:
59
課堂實作 請寫出 Mate 類別的各方法 – public Mate(Dog d, Cat c) 複製狗狗 d 與貓咪 c ,成為 Mate 物件的欄位變數 – public String toString() 印出 “ 狗狗 : 狗狗名字 ( 年齡 ) 跟貓咪 : 貓咪名字 ( 年齡 ) 是 好朋友 " – public void changeMate(Dog d) 複製狗狗 d 給 dogMate 欄位變數 – public void changeMate(Cat c) 複製貓咪 c 給 catMate 欄位變數 解答請見 LabAnswers\Mate_ans.java
60
SECTION 8.9 ENUMERATED TYPES 課本 p. 559
61
要怎麼表示星期幾 int day = 0; // 星期天 int day1 = 1; // 星期一 int day2 = 2; // 星期二 … int dayN = 8; // 星期 ?
62
列舉型態 (enumerated type) 定義型態 ( 課本 P. 559) enum Day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY} 宣告變數 Day workday; 指定型態值 Workday = Day.THURSDAY;
63
列舉型態 (enumerated type) 列舉型態值是個物件 – See Figure 8-15 ( 課本 p. 560) Run EnumDemo.java ( 課本 p. 562) – 假設 X 是一個列舉型態參考變數 ( 物件 ) ,則 – System.out.println(X); // 印出列舉型態值 – X.ordinal() X 參考的列舉型態值的順位 Run SportsCarDemo.java (p. 565) – (with SportsCar.java, CarType.java, CarColor.java) Run SportsCarDemo2.java (p. 566) – 注意 case 敘述後不接列舉型態 (CarType)
64
SECTION 9.2 PASSING OBJECTS AS ARGUMENTS TO METHODS
65
PASSOBJECT.JAVA(P. 570) Section 9.2
66
main Rectangle box = new Rectangle (12.0, 5.0); // line 10 物件區 box 12.0length 5.0width
67
main displayRectangle (r); // line 14 物件區 box 12.0length 5.0width displayRectangle r
68
main System.out.println(“Length : “ + r.getLength() + “Width : “ + r.getWidth()); // line 27-28 物件區 box 12.0length 5.0width getLe ngth displayRectangle r
69
PASSOBJECT2.JAVA(P. 572) Section 9.2
70
main Rectangle box = new Rectangle (12.0, 5.0); // line 11 物件區 box 12.0length 5.0width
71
main displayRectangle (r); // line 20 物件區 box 12.0length 5.0width displayRectangle r
72
main r.setLength(0.0) ; // line 37 物件區 box 0.0length 5.0width setLe ngth displayRectangle r 0.0
73
main r.setWidth(0.0) ; // line 38 物件區 box 0.0length 0.0width setW idth displayRectangle r 0.0 把物件傳入方法 可以改變物件欄位值
74
SECTION 9.3 RETURNING OBJECTS FROM METHODS
75
RETURNOBJECT.JAVA(P. 573) Section 9.3
76
main account = getAccount(); // line 15 物件區 account
77
main return new BankAccount(balance); // line 44 物件區 account 3200.0 balance getAccount input 3200.0 balance “3200.00”
78
main return new BankAccount(balance); // line 44 account = getAccount(); // line 15 account getAccount input balance 物件區 3200.0 balance “3200.00”
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.