Presentation is loading. Please wait.

Presentation is loading. Please wait.

Ch05 繼承 Java程式設計入門(2).

Similar presentations


Presentation on theme: "Ch05 繼承 Java程式設計入門(2)."— Presentation transcript:

1 Ch05 繼承 Java程式設計入門(2)

2 本章大綱 類別的繼承 覆寫和隱藏父類別的方法 隱藏父類別的成員資料 使用父類別的建構子 實例討論:薪資系統

3 繼承 繼承是物件導向程式設計的重要觀念 繼承是一個類別含括現存類別的部份或全部的成員資料或成員方法,並且新增額外的成員資料或方法,或是覆寫或隱藏繼承類別的方法或變數

4 類別的繼承-說明 當一個類別是繼承自其它類別,我們稱這個類別為繼承類別的「子類別」(Subclass)或「延伸類別」(Derived Class),繼承的類別稱為「父類別」(Superclass)或「基礎類別」(Base Class)。例如:類別Nissan是繼承自類別Car,繼承關係如右圖所示:

5 繼承的例子 繼承關係: 程式: class A{} class B extends A {} class C extends A {}
class D extends B {} class E extends B {}

6 Java類別的始祖 所有類別的基礎類別 Object 下列兩行的類別定義方式是相同的:
教學網址: 類別list: 下列兩行的類別定義方式是相同的: class A {} class A extends Object {}

7 類別的繼承-兄弟類別 多個子類別繼承同一個父類別,每一個子類別稱為「兄弟類別」(Sibling Classes),如下圖所示:

8 類別的繼承-父類別 父類別Car定義轎車的基本資料,如下所示: class Car { private int engineNum;
private int color; public void setNum(int num) { engineNum=num; } public void setColor(int color) { this.color=color; } public void printVehicle() { } }

9 類別的繼承-子類別 因為車輛分為很多種廠牌,例如:Ford、Nissan和VM等,以轎車Nissan子類別的宣告為例,如下所示:
class Nissan extends Car { private double price; public Nissan(int num, int color, double price) { } public void printNissan() { } }

10 類別的繼承-限制條件 雖然子類別可以繼承父類別的所有成員資料和方法,但是在存取時仍有一些限制,如下所示:
子類別不能存取父類別宣告成private的成員資料和方法。 父類別的建構子不屬於類別成員,所以在子類別並不能繼承父類別的建構子,只能呼叫父類別的建構子。

11 範例1:建立車輛資料(1/4 ) 宣告Car類別,宣告Nissan類別繼承自Car類別 在Nissan類別中新增price成員變數
建立兩台車,一輛為Joe的車,一輛為Jane的車

12 範例1:建立車輛資料(2/ 4) Car類別(car.java) class Car { private int engineNum;
private int color; public void setNum(int num) engineNum = num; } public void setColor(int color) this.color = color; public void printCar() System.out.println("引擎號碼: " + engineNum); System.out.println("色彩: " + color); Ch04/car.java

13 範例1:建立車輛資料(3/4 ) 主程式與子類別Nissan(Ch04_01.java) class Ch04_01 {
public static void main(String [] args) Nissan joe = new Nissan( , 1, ); Nissan jane = new Nissan( , 2, ); joe.setColor(3); joe.printNissan(); jane.printNissan(); } class Nissan extends Car private double price; public Nissan(int num, int color, double price) setNum(num); setColor(color); this.price = price; public void printNissan() System.out.println("===驕車資料=="); printCar(); System.out.println("車價: " + price); Ch04/Ch04_01.java

14 範例1:建立車輛資料(4/4) 結果:

15 活動筋骨和大腦(1) 參考範例1 建立一個Toyota的子類別,繼承Car,並且在Toyota類別中有一個屬性是氣缶量,及一個方法set氣缶
新增兩個物件 C1(12345, 2, 2800) C2(23232, 5, 3500)

16 基本繼承 非private修飾的物件成員都可以被繼承 子類別的物件實體包含父類別的物件實體

17 類別成員與繼承 類別屬性經過繼承之後,還是只有一份資料儲存區。 這份資料儲存區是父類別、子類別、父類別的物件及子類別的物件所共有。
繼承之後,類別成員都還是只有一個

18 範例2:類別成員的測試(1/4) 建立如下的類別和物件

19 範例2:類別成員的測試(2/4) 類別Super3和子類別Sub3 class Super3 {
static String className = "Super3"; String data = "Superdata"; static void setClassName(String n) className = n; } class Sub3 extends Super3 int j = 2;

20 範例2:類別成員的測試(3/4) 主程式 class Ch04_02 {
public static void main(String [] args) Super3 a = new Super3(); Sub3 b = new Sub3(); b.className = "透過子類別物件更改父類別屬性"; System.out.println(a.className); b.setClassName("透過子類別物件呼叫父類別方法"); System.out.println(Sub3.className); } Ch04/Ch04_02.java

21 範例2:類別成員的測試(4/4)

22 活動筋骨和大腦(2) 參考範例1及範例2 修改範例1,在類別Car中加入一個類別屬性count,記錄國內目前有多少車輛
建立一個Toyota的子類別,繼承Car 建立兩台車,分別是wang的車(屬性: ,4, )和toto的車(屬性: , 1, ) 檢查一下,現在國內的車輛應該有幾台? Ch04/Ex04_01.java

23 Private成員不被繼承 以private宣告的父類別之物件成員不被子類別所繼承。
不被繼承的成員存在子類別物件中的父類別物件內,只是子類別物件無權使用。 子類別物件可以透過父類別的public方法操縱父類別的private屬性。

24 範例3:測試private成員(1/4) class Super4 { private String data = "原始資料";
void setData(String n) { data = n; } String getData() { return data; } } class Sub4 extends Super4 {}

25 範例3:測試private成員(2/4) Sub4型別的b可以使用繼承而來的setData()和getData()。

26 範例3:測試private成員(3/4) 主程式 class Ch04_03 {
public static void main(String [] args) Super4 a = new Super4(); Sub4 b = new Sub4(); //System.out.println(a.data); //System.out.println(b.data); System.out.println("修改data的值之前: "); System.out.println("a的data: " + a.getData()); System.out.println("b的data: " + b.getData()); System.out.println("修改data的值之後: "); b.setData("資料變更"); } Ch04/Ch04_03.java

27 範例3:測試private成員(4/4)

28 重新定義父類別的物件屬性 子類別新定義的成員和父類別的成員實際上是位於不同的領域(scope)。
子類別可重新定義與「父類別物件屬性」同名的屬性。 透過子類別物件參照無法存取已被重新定義的父類別屬性。 子類別的物件方法可以取用父類別的非private之物件屬性。

29 super-父類別物件之參照

30 範例4:重新定義父類別物件屬性及super(1/3)
class Super5 { String data = "原始資料"; String m = "父類別才有的資料"; void setData(String n) { data = n; } String getData() { return data; } } class Sub5 extends Super5 { String data = "Sub的原始資料"; { System.out.println("Sub5的data: " + data); System.out.println("Sub5父類別Super5的data: " + super.data); System.out.println("Sub5父類別Super5的m: " + m); return data;

31 範例4:重新定義父類別物件屬性及super(2/3)
主程式 class Ch04_04 { public static void main(String [] args) Super5 a = new Super5(); Sub5 b = new Sub5(); System.out.println("修改data的值之前: "); System.out.println("a的data: " + a.getData()); System.out.println("b的data: " + b.getData()); System.out.println("修改data的值之後: "); b.setData("資料變更"); } Ch04/Ch04_04.java, Ch04_04_01.java

32 範例4:重新定義父類別物件屬性及super(3/3)

33 建構子與繼承 建構子不被繼承,無法透過子類別名稱去呼叫父類別的建構子。
在父類別及子類別都沒有定義建構子的情形下,建立子類別物件時,父類別的預設建構子會先被呼叫,接著子類別的預設建構子才會被呼叫。 如果是自訂的建構子,父類別的無參數建構子會先被呼叫,接著子類別的無參數建構子才被呼叫。 建立延伸類別的物件時,延伸類別的每個基礎類別之建構子都會被呼叫。

34 使用super()呼叫父類別建構子 super()的功能是呼叫父類別的建構子。
this()和super()都只能在建構子內使用,並且必須出現在建構子的第一個敘述。 this()和super()只能擇一而用,不能同時使用 子類別建構子未使用super(<參數列>)時,編譯器會自動加入預設的父類別建構子呼叫 class 父類別名(){ 父類別名(){} } class 子類別名(){ 子類別名(){ super(); //若無此敘述,則編譯器會自動加入 //程式敘述 子類別名(形式參數列){

35 範例5 class Car5 { static int count; private int serial_num;
class Nissan5 extends Car5 { int color; int engineNum; double price; Nissan5(int num, int color, int no, double price) { super(num, color, no); this.color = 5; engineNum = ; this.price = price; } void printCar() { System.out.print("===="); super.printCar(); System.out.println("轎車資料===="); System.out.println("色彩(父): " + super.color); System.out.println("引擎號碼(父): " + super.engineNum); System.out.println("色彩(子): " + color); System.out.println("引擎號碼(子): " + engineNum); System.out.println("車價: " + price); System.out.println("車輛數: " + count); class Car5 { static int count; private int serial_num; int engineNum; int color; Car5(int num, int color, int no) serial_num = num; this.color = color; engineNum = no; count++; } void printCar() System.out.print("編號: " + serial_num);

36 範例5 class Ch04_05 { public static void main(String [] args)
Nissan5 joe = new Nissan5(1,1, , ); Nissan5 jane = new Nissan5(2,2, , ); joe.printCar(); jane.printCar(); }

37 活動筋骨、大腦時間(2) class MidTerm extends Test class Test { { public int num;
public int numOfStudents; public MidTerm(int no, String name, int numOfStudents) (no, name); .numOfStudents = numOfStudents; } public void printMidTerm() .printTest(); System.out.println("學生人數: " + numOfStudents); System.out.println("子呼叫父super.name : " + super.name); System.out.println("子呼叫name : " + name); System.out.println("子呼叫this.name : " + this.name); class Test { public int num; public String name; public Test(int num, String name) { .num = num; .name = name; } public void printTest() System.out.println("學號no : " + num); System.out.println("姓名name : " + name);

38 活動筋骨、大腦時間(2) 主程式 class Ex04_02 {
public static void main(String [] args) MidTerm mid = new MidTerm(1, "wang", 10); mid.printMidTerm(); }

39 實例討論-薪資系統 系統需求:建立一個計算公司內所有員工的薪水 一般員工:薪水 = 月薪 + 加班費 業務員:薪水 = 月薪 + 業績獎金
一般員工:薪水 = 月薪 + 加班費 加班費 = 加班時數 * 100 業務員:薪水 = 月薪 + 業績獎金 業績獎金 = 業績 * 0.05 主管:薪水 = 月薪 計時工作人員:薪水 = 工作時數*100 計件工作人員:薪水=工作件數 * 10

40 實例討論-薪資系統 依照前述的系統需求,讓我們會很容易認為薪資系統中可以分為5個類別 一般員工 業務員 主管 計時工作人員 計件工作人員

41 實例討論-薪資系統 類別:業務員 類別:一般員工 class 業務員 { String 姓名; class 一般員工
int 月薪; int 業績獎金; int 薪水; 業務員(String name, String dept, int salary, int 業績) { 姓名 = name; 工作部門 = dept; 月薪 = salary; 業績獎金 = 業績 * 5 / 100; 薪水 = 月薪 + 業績獎金; } void print薪資單() { System.out.println("薪資單"); System.out.println("姓名: " + 姓名 + " 工作部門: " + 工作部門); System.out.println("月薪: " + 月薪); System.out.println("業績獎金: " + 業績獎金); System.out.println("總計: " + 薪水); 類別:一般員工 class 一般員工 { String 姓名; String 工作部門; int 月薪; int 加班費; int 薪水; 一般員工(String name, String dept, int salary, int h) { 姓名 = name; 工作部門 = dept; 月薪 = salary; 加班費 = h * 100; 薪水 = 月薪 + 加班費; } void print薪資單() { System.out.println("薪資單"); System.out.println("姓名: " + 姓名 + " 工作部門: " + 工作部門); System.out.println("月薪: " + 月薪); System.out.println("加班費: " + 加班費); System.out.println("總計: " + 薪水);

42 實例討論-薪資系統 類別:計時工作人員 類別:主管 class 計時工作人員 { String 姓名; class 主管
int 工作時數; int 工作時薪; int 薪水; 計時工作人員(String name, String dept, int h) { 姓名 = name; 工作部門 = dept; 工作時數 = h; 工作時薪 = h * 100; 薪水 = 工作時薪; } void print薪資單() { System.out.println("薪資單"); System.out.println("姓名: " + 姓名 + " 工作部門: " + 工作部門); System.out.println("工作時數: " + 工作時數); System.out.println("工作時薪: " + 工作時薪); System.out.println("總計: " + 薪水); 類別:主管 class 主管 { String 姓名; String 工作部門; int 月薪; 主管(String name, String dept, int salary) 姓名 = name; 工作部門 = dept; 月薪 = salary; } void print薪資單() System.out.println("薪資單"); System.out.println("姓名: " + 姓名 + " 工作部門: " + 工作部門); System.out.println("月薪: " + 月薪); System.out.println("總計: " + 月薪);

43 實例討論-薪資系統 類別:計件工作人員 薪資主程式 class 計件工作人員 { String 姓名; String 工作部門;
int 工作件數; int 工作件薪; int 薪水; 計件工作人員(String name, String dept, int h) { 姓名 = name; 工作部門 = dept; 工作件數 = h; 工作件薪 = h * 10; 薪水 = 工作件薪; } void print薪資單() { System.out.println("薪資單"); System.out.println("姓名: " + 姓名 + " 工作部門: " + 工作部門); System.out.println("工作件數: " + 工作件數); System.out.println("工作件薪: " + 工作件薪); System.out.println("總計: " + 薪水); 薪資主程式 class 薪資系統v1 { public static void main(String [] args) { 一般員工 A0 = new 一般員工("A0", "會計室", 25000, 5); 主管 A1 = new 主管("A1", "主任", 65000); 業務員 A2 = new 業務員("A2", "業務部", 15000, 40000); 計時工作人員 A3 = new 計時工作人員("A3", "生產部", 100); 計件工作人員 A4 = new 計件工作人員("A4", "生產部", 200); A0.print薪資單(); A1.print薪資單(); A2.print薪資單(); A3.print薪資單(); A4.print薪資單(); } 薪資系統v1

44 實例討論-薪資系統 觀察前述的五個類別,會發現程式有多處相同,若我們將相同處,作一個歸納,可將五個類別分成兩大類:
正職:一般員工、業務員、主管 兼職:計時工作人員、計件工作人員 若是將上述二個類別,再作一個歸納,會變成一個類別: 員工:正職、兼職 因此,我們可以有繼承關係: class 員工 class 正職 extends 員工 class 一般員工 extends 正職 class 業務員 extends 正職 class 主管 extends 正職 class 兼職 extends 員工 class 計時工作人員 extends 兼職 class 計次工作人員 extends 兼職

45 實例討論-薪資系統 class 員工 class 正職 { class 正職 extends 員工 String 姓名; {
int 薪水; 員工(String name, String dept) 姓名 = name; 工作部門 = dept; } void print薪資單() System.out.println("薪資單"); System.out.println("姓名: " + 姓名 + " 工作部門: " + 工作部門); class 正職 class 正職 extends 員工 { int 月薪; 正職(String name, String dept, int salary) super(name, dept); 月薪 = salary; } void print薪資單() super.print薪資單(); System.out.println("月薪: " + 月薪);

46 實例討論-薪資系統 class 一般員工 class 業務員 class 一般員工 extends 正職 { int 加班費;
一般員工(String name, String dept, int salary, int h) super(name, dept, salary); 加班費 = h * 100; 薪水 = salary + 加班費; } void print薪資單() super.print薪資單(); System.out.println("加班費: " + 加班費); System.out.println("總計: " + 薪水); class 業務員 class 業務員 extends 正職 { int 業績獎金; 業務員(String name, String dept, int salary, int 業績) super(name, dept, salary); 業績獎金 = 業績 * 5 / 100; 薪水 = salary + 業績獎金; } void print薪資單() super.print薪資單(); System.out.println("業績獎金: " + 業績獎金); System.out.println("總計: " + 薪水);

47 實例討論-薪資系統 class 主管 class 兼職 class 主管 extends 正職 {
主管(String name, String dept, int salary) super(name, dept, salary); 薪水 = salary; } void print薪資單() super.print薪資單(); System.out.println("總計: " + 薪水); class 兼職 class 兼職 extends 員工 { int 工資; 兼職(String name, String dept) super(name, dept); } void print薪資單() super.print薪資單(); System.out.println("工資: " + 工資);

48 實例討論-薪資系統 class 計時工作人員 class 計件工作人員 class 計時工作人員 extends 兼職 {
計時工作人員(String name, String dept, int h) super(name, dept); 工資 = h * 100; 薪水 = 工資; } void print薪資單() super.print薪資單(); System.out.println("總計: " + 薪水); class 計件工作人員 class 計件工作人員 extends 兼職 { 計件工作人員(String name, String dept, int 件數) super(name, dept); 工資 = 件數 * 10; 薪水 = 工資; } void print薪資單() super.print薪資單(); System.out.println("總計: " + 薪水);

49 實例討論-薪資系統 薪資系統主方法: class 薪資系統v2 {
public static void main(String [] args) 一般員工 A0 = new 一般員工("A0", "會計室", 25000, 5); 主管 A1 = new 主管("A1", "主任", 65000); 業務員 A2 = new 業務員("A2", "業務部", 15000, 40000); 計時工作人員 A3 = new 計時工作人員("A3", "生產部", 100); 計件工作人員 A4 = new 計件工作人員("A4", "生產部", 200); A0.print薪資單(); A1.print薪資單(); A2.print薪資單(); A3.print薪資單(); A4.print薪資單(); } 薪資系統v2

50 實例討論-薪資系統 我們可以將真正屬於某類別的屬性和方法,放在這個類別中,可以讓程式碼更簡短,更容易閱讀,也容易偵測。
有了繼承,程式的可更容易再利用。不需要一再的複製和貼上。 如果,要建立一個人事系統,其中類別:員工、正職、兼職,可以再被繼承,可再用於新系統中,不用再寫一次。 可以


Download ppt "Ch05 繼承 Java程式設計入門(2)."

Similar presentations


Ads by Google