chapter 8 a second look at classes and objects. section 8.1 static class members roomareas.java (...
TRANSCRIPT
Chapter 8 A Second Look at Classes and Objects
SECTION 8.1 STATIC CLASS MEMBERS
RoomAreas.java( 課本 p. 372)
Rectangle.java( 課本 p. 366)
main
Rectangle kitchen = new Rectangle (); // line 17
物件區
numbertotalArea
inputkitchen
bedroomden
length
width
main
Rectangle bedroom = new Rectangle ();// line 18
物件區
length
widthnumber
totalAreainput
kitchenbedroom
den
length
width
main
Rectangle den = new Rectangle (); // line 19
物件區
length
widthnumber
totalAreainput
kitchenbedroom
den
length
width
length
width
main
kitchen.setWidth(number); // line 29
物件區
10.0length
14.0width14.0number
totalAreainput
kitchenbedroom
den
length
width
length
width
Double
parseDoubl
e
“14”
setWidth
14.0
每個物件有自己的欄位方法只作用在「某個物件」的欄位
main
bedroom.setLength(number); // line 35
物件區
10.0length
14.0width14.0number
totalAreainput
kitchenbedroom
den
15.0length
width
length
width
Double
parseDoubl
e
“14”
15.0
setLength
每個物件有自己的欄位方法只作用在「某個物件」的欄位
main
totalArea = kitchen.getArea() + bedroom.getArea() + den.getArea();// line 52-53
物件區
10.0length
14.0width30.0number
totalAreainput
kitchenbedroom
den
15.0length
12.0width
20.0length
30.0width
“30”
getArea140.0
getArea
getArea
180.0
600.0
main
totalArea = kitchen.getArea() + bedroom.getArea() + den.getArea();// line 52-53
物件區
10.0length
14.0width30.0number
920.0totalAreainput
kitchenbedroom
den
15.0length
12.0width
20.0length
30.0width
“30”
getArea140.0
getArea
getArea
180.0
600.0+
+
問題討論• 新題目
– 條件 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?
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
main
Bob 的方法 物件區
10.0length
width
setLength
numbertotalArea
inputkitchen
bedroomden
1count
15.0length
width1count
20.0length
width1count
setLength
setLength
getCount
1
main
正確的方法— static 的使用static private int count; 物件區
numbertotalArea
inputkitchen
bedroomden
0count
length
width
length
width
length
width
屬於整個 Rectangle類別
main
正確的方法— static 的使用 kitchen.setLength(number); 物件區
numbertotalArea
inputkitchen
bedroomden
1count
length
width
length
width
10.0length
width
main
正確的方法— static 的使用bedroom.setLength(number); 物件區
numbertotalArea
inputkitchen
bedroomden
2count
length
width
15.0length
width
10.0length
width
main
正確的方法— static 的使用den.setLength(number); 物件區
numbertotalArea
inputkitchen
bedroomden
3count
20.0length
width
15.0length
width
10.0length
width
main
正確的設計— static 的使用kitchen.getCount() 物件區
numbertotalArea
inputkitchen
bedroomden
3count
20.0length
width
15.0length
width
10.0length
widthgetCount
3
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
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.0length
width
• 靜態方法限制– Compile Lab8_2.java, Lab8_2_1.java, Lab8_2_2.java, Lab8_2_3.java
10.0length
width
Rectangle 類別
METRIC.JAVA & METRICDEMO.JAVA( 課本 pp. 567-8)
main
Line 17 (MetricDemo.java, p. 526)
DecimalFormat fmt = new DecimalFormat("0.00");
物件區
inputmileskilosfmt
ShowMessageDialog
ShowInputDialog
JOptionPane class
mToKkToM
Metric class
Double class
DecimalFormatclass
“0.00”
DecimalFormat
format
parseDoub
le
main
Line 21 (MetricDemo.java) 物件區
inputmileskilosfmt
ShowMessageDial
og
ShowInputDialog
JOptionPane class
mToKkToM
Metric class
Double class
DecimalFormatclass
“0.00”
DecimalFormat format
“10”
parseDoubl
e
main
Line 23 (MetricDemo.java)
miles = Double.parseDouble(input); 物件區
input10.0miles
kilosfmt
ShowMessageDial
og
ShowInputDialog
JOptionPane class
mToKkToM
Metric class
Double class
DecimalFormatclass
“0.00”
DecimalFormat format
“10”
parseDoubl
e
main
Line 26 (MetricDemo.java)
kilos = Metric.milesToKilometers(miles); 物件區
input10.0miles
16.09kilosfmt
ShowMessageDial
og
ShowInputDialog
JOptionPane class
mToKkToM
Metric class
Double class
DecimalFormatclass
“0.00”
DecimalFormat format
“10”
parseDoubl
e
10.0
Static 效果
2count
10.0length
4weight
10.0length
2weightamanda
• In main– Dog.length // 哪個 ? – amanda.length // – Dog.count // – amanda.count //
bob
Dog
main
Static 效果
2count
10.0length
4weight
10.0length
2weightamanda
• In M1– length • 執行哪個 M1 ,就用哪
個 length
– count • 就是靜態欄位 count• 只有一個
bob
Dog
M1
M1
Static 效果
2count
10.0length
4weight
10.0length
2weightamanda
• In M2– length • 用哪個 length?
– count • 就是靜態欄位 count• 只有一個 bob
Dog
M2
SECTION 8.4 THE TOSTRING METHOD
(p. 533)
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 功能– 請用「狗狗姓名 + “@” + 狗狗年齡」代表物件字串
SECTION 8.5 WRITING AN EQUALS METHOD
(p. 537)
比較物件• 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. ?)
main
Stock company1 = new Stock("XYZ", 9.62); // line 12
物件區
company1company2
symbol
5
9.62sharePrice
“XYZ”
main
Stock company2 = new Stock("XYZ", 9.62); // line 13
物件區
company1company2
symbol
5
9.62sharePrice
“XYZ”
symbol
5
9.62sharePrice
“XYZ”
main
if (company1 == company2) // line 17
物件區
company1company2
symbol
5
9.62sharePrice
“XYZ”
symbol
5
9.62sharePrice
“XYZ”
STOCKCOMPARE.JAVA(p. 539)
main
if (company1.equals(company2)) // line 15
物件區
company1company2
symbol
4
9.62sharePrice
“XYZ”
symbol
5
9.62sharePrice
“XYZ”
equals
主程式之所以知道要呼叫company1.equals(company2) ,是因為:(1)company1 與 company2 都屬於 Stock 類別(2)Stock 類別提供了 equals 方法可供比較
類別設計者為何寫 equals(Stock object2) :(3) 提供比較服務(4) 傳入另一物件與方法所啟動的物件做比較
main
if (symbol.equals(object2.symbol) && // line 73 of Stock.java
物件區
company1company2
symbol
4
9.62sharePrice
“XYZ”
symbol
5
9.62sharePrice
“XYZ”
equals
equals object2status
在這個當下 (line 73 of Stock.java) ,請問程式可以存取哪幾區的記憶體?
(A) company1 in main()(B) 上方物件的 symbol 欄位(C) 下方物件的 symbol 欄位(D) object2 in equals()
main
sharePrice == object2.sharePrice // line 74
物件區
company1company2
symbol
4
9.62sharePrice
“XYZ”
symbol
5
9.62sharePrice
“XYZ”
equals
object2status
課堂實作• Do Algorithm Workbench 1 (pp. 577-8)– toString: 傳回半徑與面積– equals: 面積相同則代表相同
• Open Labs\CircleDemo.java• 解答: LabAnswers\CircleDemo_ans.java
SECTION 8.8 THE THIS REFERENCE VARIABLE
(p. 556)
main
this物件區
company1company2
symbol
9.62sharePrice
“XYZ”
this5
this
• 可用於所有 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
8.7 AGGREGATION(P. 543)
到目前為止,我們自己寫的類別,都是用來修飾區域變數的型態…
課本 p. 551
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)
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
textBookCourse
Course(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
textBookCourse
Course(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
textBookCourse
Course(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
textBookCourse
Instructor
3Instructor
Instructor (Instructor)
lastName = object2.lastName;firstName = object2.firstName;officeNumber = object2.officeNumber;
object23
“Kramer”
“Shawn”
“RH3010”
4
“Starting…”
“Gaddis”“Addison…
”
"Intro to Java”courseName
4
instructor
textBookCourse
Instructor
3
“Kramer”
“Shawn”
“RH3010”
Instructor
Instructor (Instructor)
}
object23
“Kramer”
“Shawn”
“RH3010”
4
“Starting…”
“Gaddis”“Addison…
”
"Intro to Java”courseName
4
instructor
textBookCourse
Instructor
3
“Kramer”
“Shawn”
“RH3010”
Instructor
Return to …
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
textBookCourse
3
“Kramer”
“Shawn”
“RH3010”
Instructor
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
textBook4
“Kramer”
“Shawn”
“RH3010”
“Starting…”
“Gaddis”“Addison…
”4
Course
Course(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
textBook4
“Kramer”
“Shawn”
“RH3010”
“Starting…”
“Gaddis”“Addison…
”4
Return to …main
Course
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
Aggregation
• Run Lab8_7.java– 請注意 #25– myInstructor 與 myCourse 所包含的 instructor 是
同一物件 ?
課堂實作• 續 Lab8_7.java• 請修改 Course.java 的某一行• 讓輸出結果改成:
• 解答請見 LabAnswers\Course_ans.java
課堂實作• Open Mate\Dog.java, Cat.java,
MateDemo.java, Mate.java• 狗狗跟貓咪可以配成好友 (Mate)• 已知 MateDemo.java 執行後印出:
課堂實作• 請寫出 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
SECTION 8.9 ENUMERATED TYPES課本 p. 559
要怎麼表示星期幾• int day = 0; // 星期天• int day1 = 1; // 星期一• int day2 = 2; // 星期二• …• int dayN = 8; // 星期 ?
列舉型態 (enumerated type)
• 定義型態 ( 課本 P. 559)
enum Day {SUNDAY, MONDAY , TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}
• 宣告變數Day workday;
• 指定型態值Workday = Day.THURSDAY;
列舉型態 (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)
SECTION 9.2 PASSING OBJECTS AS ARGUMENTS TO METHODS
PASSOBJECT.JAVA(P. 570)Section 9.2
main
Rectangle box = new Rectangle (12.0, 5.0); // line 10
物件區
box
12.0length
5.0width
main
displayRectangle (r); // line 14
物件區
box
12.0length
5.0width
displayRectangler
main
System.out.println(“Length : “ + r.getLength() + “Width : “ + r.getWidth()); // line 27-28
物件區
box
12.0length
5.0width
getLength
displayRectangler
PASSOBJECT2.JAVA(P. 572)Section 9.2
main
Rectangle box = new Rectangle (12.0, 5.0); // line 11
物件區
box
12.0length
5.0width
main
displayRectangle (r); // line 20
物件區
box
12.0length
5.0width
displayRectangler
main
r.setLength(0.0) ; // line 37
物件區
box
0.0length
5.0width
setLength
displayRectangler
0.0
main
r.setWidth(0.0) ; // line 38
物件區
box
0.0length
0.0width
setWidth
displayRectangler
0.0
把物件傳入方法可以改變物件欄位值
SECTION 9.3 RETURNING OBJECTS FROM METHODS
RETURNOBJECT.JAVA(P. 573)Section 9.3
main
account = getAccount(); // line 15
物件區
account
main
return new BankAccount(balance); // line 44
物件區
account
3200.0balance
getAccountinput
3200.0balance“3200.00”
main
return new BankAccount(balance); // line 44account = getAccount(); // line 15
account
getAccountinput
balance
物件區
3200.0balance
“3200.00”