52
10.1 WHAT IS INHERITANCE p. 643

10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Embed Size (px)

Citation preview

Page 1: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

10.1 WHAT IS INHERITANCEp. 643

Page 2: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Labrador

Page 3: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Corgi

Page 4: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Is-a 關係

Dog

Labrador Corgi

Page 5: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Is-a & Inheritance

• Is-a 關係的定義 ( 課本 p. 644)

– 每隻 Corgi 都是一隻 Dog – 所有 Corgi 都是 Dog– 中文應該翻成「是一種」– 類別間關係• 問題討論:請問 amanda is-a Dog?

– 真實世界的現象• Inheritance( 課本 p. 644)

– 定義– 特性

Page 6: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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)

Page 7: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

main

missed = Integer.parseInt(input); // line 24 (FinalExamDemo.java)

物件區

input20questions3missed

“20”

“3”

exam

Page 8: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 9: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 10: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 11: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

FinalExam

setScore(numericScore);

物件區

85.0numericScore

20questions3missed

“20”

“3” 20numQuestions

5.0pointsEach

3numMissed

FinalExam(int, int)

getPointsEach()

getNumMissed()

setScore(double) getScore() getGrade()

score

85.0

Page 12: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 13: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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 …

Page 14: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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 …

Page 15: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 16: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 17: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 18: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 19: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

父類別成員 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()

Page 20: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Checkpoints

• Do Checkpoint 10.2 (a)(c)(d)(e) (p. 655)

Page 21: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

10.2 CALLING THE SUPERCLASS CONSTRUCTOR

p. 656

Page 22: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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();

Page 23: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

main

SubClass2 obj = new SubClass2();

物件區

obj

SubClass2()

SuperClass2(int)

不可將父類別建構式視為可繼承的方法

SuperClass2()

Page 24: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

SubClass2

super(10);

物件區

SubClass2()

SuperClass2(int)

10

SuperClass2()

Page 25: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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()

Page 26: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 27: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 28: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 29: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 30: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 31: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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 …

Page 32: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 33: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

} // 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

Page 34: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 35: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Do Checkpoints

• Checkpoint 10.4 (p. 663)

• Checkpoint 10.5

Page 36: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

10.3 OVERRIDING SUPERCLASS METHODS

GradedActivity.java( 課本 p. 645)CurvedActivity.java( 課本 p. 666)CurvedActivityDemo.java( 課本 p. 668)

Page 37: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi
Page 38: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Overriding

• 定義 (p. 664)

• Read CurvedActivity.java (p. 666)

– 調分活動– setScore(double) (#32)• 注意方法特徵• 比較父類別的 setScore(double) (p. 645)

• 方法覆蓋的要件 (p. 667)

– super. 父類別成員 (#35)• 請將本行改成 score = rawScore * percentage;• 編譯並觀察其結果

Page 39: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Overriding

• Run & Read CurveActivityDemo.java (p. 668)

• See ppt. 40-48• 問題討論– 這個程式產生了幾個評分物件 ?– 每個評分物件中有幾個父類別所宣告的欄位 ?– 每個評分物件中有幾個子類別所宣告的欄位 ?– 請說明哪些方法將值設定於欄位中 ?

Page 40: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 41: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 42: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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)

Page 43: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 44: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

setScore

rawScore = s; // #34 (p. 667)

物件區

87.0s

Scanner

CurvedActivity(doubl

e)

setScore(double)

0.0score87.0rawScore1.06percentage

getScore()getGrade()

getRawSCore()

getPercentage()

setScore(double)

Page 45: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 46: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 47: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 48: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

main

//#32 執行結束 (p. 668)

物件區Scanner

CurvedActivity(doubl

e)

setScore(double)

92.22score87.0rawScore1.06percentage

getScore()getGrade()

getRawSCore()

getPercentage()

setScore(double)

87.0score1.06curvePercent

keyboardcurvedExam

Page 49: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

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

Page 50: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

Overloading vs. Overriding

• Run ShowValueDemo.java (p. 671)

• Overloading 與 overriding 的基本原則– 課本 p. 670

• 避免被覆蓋 (p. 712)– Compile Lab10_7.java

Page 51: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

課堂實作• Open Labs\Family 資料夾• 請閱讀各程式

– Couple 類別:用來紀錄一對夫妻的資料– Family 類別:用來記錄一個家庭 ( 含一對夫妻 ) 的資料– FamilyDemo 類別:包含主程式

• 已知 FamilyDemo 可以正確執行,其執行結果如下頁– FamilyDemo 類別與 Couple 類別程式碼不可變動

• 現在需要你– 繼承 Couple 類別– 在 Family 類別的三的空格處填入程式碼

• 答案放在 Answers\Family

Page 52: 10.1 WHAT IS INHERITANCE p. 643. Labrador Corgi

課堂實作