Post on 18-Jan-2016
transcript
10.1 WHAT IS INHERITANCEp. 643
Labrador
Corgi
Is-a 關係
Dog
Labrador Corgi
Is-a & Inheritance
• Is-a 關係的定義 ( 課本 p. 644)
– 每隻 Corgi 都是一隻 Dog – 所有 Corgi 都是 Dog– 中文應該翻成「是一種」– 類別間關係• 問題討論:請問 amanda is-a Dog?
– 真實世界的現象• Inheritance( 課本 p. 644)
– 定義– 特性
Inheritance
• Read GradedActivity.java (p. 645)
– 評分活動– Run GradeDemo.java (p. 646)
• Read FinalExam.java (p. 648)
– 期末考是一種評分活動– extends (#5)– setScore (#33)
• Run FinalExamDemo.java (p. 651)– 注意 exam 的類別 (#27)– exam.getPointsEach() (#31)– exam.getScore() (#33)– exam.getGrade() (#34)
main
missed = Integer.parseInt(input); // line 24 (FinalExamDemo.java)
物件區
input20questions3missed
“20”
“3”
exam
main
FinalExam exam = new FinalExam(questions, missed); // line 27 (FinalExamDemo.java)
物件區
input20questions3missed
“20”
“3”numQuestions
pointsEach
numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
score
(20, 3)
exam
FinalExam
double numericScore; // line 20 (FinalExam.java) numQuestions = questions;numMissed = missed;
物件區
numericScore
20questions3missed
“20”
“3” 20numQuestions
pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
score
FinalExam
pointsEach = 100.0 / questions;numericScore = 100.0 - (missed * pointsEach);
物件區
85.0numericScore
20questions3missed
“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
score
FinalExam
setScore(numericScore);
物件區
85.0numericScore
20questions3missed
“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
score
85.0
setScore
score = s; // line 16 (GradedActivity.java) }
物件區
85.0s
“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
85.0score
setScore
score = s; // line 16 (GradedActivity.java) }
物件區
85.0s
“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
85.0score
Return to …
setScore(numericScore);}
物件區“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
85.0score
FinalExam
85.0numericScore
20questions3missed
main
Return to …
main
FinalExam exam = new FinalExam(questions, missed); // line 27
input20questions3missed
物件區“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
85.0score
exam
main
JOptionPane.showMessageDialog(null, "Each question counts " + exam.getPointsEach() + " points.\nThe exam score is " + exam.getScore() + "\nThe exam grade is " + exam.getGrade());
input20questions3missed
物件區“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
85.0score
exam
main
JOptionPane.showMessageDialog(null, "Each question counts " + exam.getPointsEach() + " points.\nThe exam score is " + exam.getScore() + "\nThe exam grade is " + exam.getGrade());
input20questions3missed
物件區“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
85.0score
exam
main
JOptionPane.showMessageDialog(null, "Each question counts " + exam.getPointsEach() + " points.\nThe exam score is " + exam.getScore() + "\nThe exam grade is " + exam.getGrade());
input20questions3missed
物件區“20”
“3” 20numQuestions
5.0pointsEach
3numMissed
FinalExam(int, int)
getPointsEach()
getNumMissed()
setScore(double) getScore() getGrade()
85.0score
exam
父類別成員 vs. 繼承• Public in Superclass– 存在物件內– 子類別可以直接存取
• Private in Superclass– 存在物件內– 子類別無法直接存取
• Compile Lab10_1a.java
– 被視為「不被繼承的」成員 ( 課本 p. 650)
• Constructor in Superclass ( 課本 p. 650)
– Compile Lab10_1b.java– 「不被繼承」 ( 課本 p. 650)
exam.getGrade() in main()setScore(numericScore) in FinalExam()
Checkpoints
• Do Checkpoint 10.2 (a)(c)(d)(e) (p. 655)
10.2 CALLING THE SUPERCLASS CONSTRUCTOR
p. 656
super
• 還記得 default constructor 嗎 ?– 建構式的執行很重要
• Run ConstructorDemo1.java (p. 654)
– Java 偷偷加了 super()– 請注意訊息的先後順序
• super 的用途 – 存取父類別成員,含建構式 ( 課本 p. 656)
– Run ConstructorDemo2.java (p. 658)
– See ppt. 23-5– Lab
• 試著將 SubClass2.java(#9) 註解• 看看執行結果有何不同 Java 自動加上 super();
main
SubClass2 obj = new SubClass2();
物件區
obj
SubClass2()
SuperClass2(int)
不可將父類別建構式視為可繼承的方法
SuperClass2()
SubClass2
super(10);
物件區
SubClass2()
SuperClass2(int)
10
SuperClass2()
SuperClass2
public SuperClass2(int arg) { System.out.println("The following argument " + "was passed to the superclass " + "constructor: " + arg); }
物件區
SubClass2()
SuperClass2(int
)
10arg
Return to …
SuperClass2()
super• 限制 ( 課本 p. 657)– Compile Lab10_2.java
• 限制 ( 課本 p. 657)– Compile Lab10_3.java
• 當子類別建構式程式碼第一行沒有寫 super– Java 偷偷加上 super();– 父類別中沒有寫建構式
• default constructor 出現• Read & Run Lab10_4b.java
– 父類別中僅存在有參數的建構式• Compile Lab10_4a.java
Cube vs. Rectangle
• Overview Rectangle class– See Figure 10-9 (p. 658)
• Read Cube.java (p. 659)
– 注意 Cube 建構式 (#17)
• Run CubeDemo.java– See ppt. 28-34
main
// line 35, 36 (CubeDemo.java)Cube myCube = new Cube(length, width, height);
物件區
10.0length15.0width
12.0heightkeyboard
Scanner
Cube(double, double, double)
widthheight
5
Rectangle(double, double)
3
myCube
length
10.0, 15.0, 12.0
Cube(double, double, double)
super(len, w); // line 20 (Cube.java)
物件區
10.0len15.0w
12.0h
Scanner
Cube(double, double, double)
widthheight
5
Rectangle(double, double)
3
length
10.0, 15.0
Rectangle(double, double)
length = len; // line 14 (Rectangle.java) width = w;
物件區
10.0len15.0w
Scanner
Cube(double, double, double)
15.0widthheight
5
Rectangle(double, double)
3
10.0length
Rectangle(double, double)
} // line 16 (Rectangle.java)
物件區
10.0len15.0w
Scanner
Cube(double, double, double)
15.0widthheight
5
Rectangle(double, double)
3
10.0length
Return to …
height = h; // line 23 (Cube.java)
物件區Scanner
Cube(double, double, double)
15.0width12.0height
5
Rectangle(double, double)
3
10.0lengthCube(double, double, double)
10.0len15.0w
12.0h
} // line 24 (Cube.java)
物件區Scanner
Cube(double, double, double)
15.0width12.0height
5
Rectangle(double, double)
3
10.0length
Return to …
Cube(double, double, double)
10.0len15.0w
12.0h
main
main
Cube myCube = new Cube(length, width, height);
物件區
10.0length15.0width
12.0heightkeyboard
Scanner
Cube(double, double, double)
5
Rectangle(double, double)
3
myCube
15.0width12.0height
10.0length
Do Checkpoints
• Checkpoint 10.4 (p. 663)
• Checkpoint 10.5
10.3 OVERRIDING SUPERCLASS METHODS
GradedActivity.java( 課本 p. 645)CurvedActivity.java( 課本 p. 666)CurvedActivityDemo.java( 課本 p. 668)
Overriding
• 定義 (p. 664)
• Read CurvedActivity.java (p. 666)
– 調分活動– setScore(double) (#32)• 注意方法特徵• 比較父類別的 setScore(double) (p. 645)
• 方法覆蓋的要件 (p. 667)
– super. 父類別成員 (#35)• 請將本行改成 score = rawScore * percentage;• 編譯並觀察其結果
Overriding
• Run & Read CurveActivityDemo.java (p. 668)
• See ppt. 40-48• 問題討論– 這個程式產生了幾個評分物件 ?– 每個評分物件中有幾個父類別所宣告的欄位 ?– 每個評分物件中有幾個子類別所宣告的欄位 ?– 請說明哪些方法將值設定於欄位中 ?
main
CurvedActivity curvedExam = new CurvedActivity(curvePercent); //#29 (p. 668)
物件區
87.0score1.06curvePercent
keyboardcurvedExam
Scanner
CurvedActivity(doubl
e)
setScore(double)
scorerawScorepercentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
1.06
CurvedActivity
percentage = percent; // #18 (p. 666)rawScore = 0.0;
物件區
1.06percent
Scanner
CurvedActivity(doubl
e)
setScore(double)
0.0score0.0rawScore
1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
Return to …
main
main
CurvedActivity curvedExam = new CurvedActivity(curvePercent); //#29 (p. 668)
物件區
87.0score1.06curvePercent
keyboardcurvedExam
Scanner
CurvedActivity(doubl
e)
setScore(double)
0.0score0.0rawScore
1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
main
curvedExam.setScore(score); //#32 (p. 668)
物件區
87.0score1.06curvePercent
keyboardcurvedExam
Scanner
CurvedActivity(doubl
e)
setScore(double)
0.0score0.0rawScore
1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
87.0
setScore
rawScore = s; // #34 (p. 667)
物件區
87.0s
Scanner
CurvedActivity(doubl
e)
setScore(double)
0.0score87.0rawScore1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
setScore
super.setScore(rawScore * percentage); // #35 (p. 667)
物件區
87.0s
Scanner
CurvedActivity(doubl
e)
setScore(double)
0.0score87.0rawScore1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
87.0*1.06
setScore
score = s; // #16 (p. 645)}
物件區
92.22s
Scanner
CurvedActivity(doubl
e)
setScore(double)
92.22score87.0rawScore1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
Return to …
因為 Overriding 的關係子類別與父類別的 setScore 方法都有一個 double 參數
在此例中,參數名稱碰巧都叫做 s
setScore
} // #36 執行結束 (p. 667)
物件區
87.0s
Scanner
CurvedActivity(doubl
e)
setScore(double)
92.22score87.0rawScore1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
Return to …
main
main
//#32 執行結束 (p. 668)
物件區Scanner
CurvedActivity(doubl
e)
setScore(double)
92.22score87.0rawScore1.06percentage
getScore()getGrade()
getRawSCore()
getPercentage()
setScore(double)
87.0score1.06curvePercent
keyboardcurvedExam
Overloading vs. Overriding
Overloading Overriding
發生於單一類別 OK Not OK
發生於繼承關係 OK OK
Run Lab10_5.java Compile Lab10_6.java
Overloading methods
Overriding methods
方法同名 Yes Yes
方法特徵相同 No Yes
Overloading vs. Overriding
• Run ShowValueDemo.java (p. 671)
• Overloading 與 overriding 的基本原則– 課本 p. 670
• 避免被覆蓋 (p. 712)– Compile Lab10_7.java
課堂實作• Open Labs\Family 資料夾• 請閱讀各程式
– Couple 類別:用來紀錄一對夫妻的資料– Family 類別:用來記錄一個家庭 ( 含一對夫妻 ) 的資料– FamilyDemo 類別:包含主程式
• 已知 FamilyDemo 可以正確執行,其執行結果如下頁– FamilyDemo 類別與 Couple 類別程式碼不可變動
• 現在需要你– 繼承 Couple 類別– 在 Family 類別的三的空格處填入程式碼
• 答案放在 Answers\Family
課堂實作