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

Slides:



Advertisements
Similar presentations
第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
Advertisements

第四章 类、对象和接口.
第一單元 建立java 程式.
项目6 通用堆栈.
大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
面向对象程序设计(Java) 徐志红
第13章 物件導向與例外處理 13-1 物件導向的基礎 13-2 類別與物件 13-3 類別的繼承 13-4 PHP的例外處理
第一章 面向对象程序设计.
11 繼承類別 11.4 建立者與破壞者 單一建立者與破壞者 11-20
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
Ch07 介面與多重繼承 物件導向程式設計(II).
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Ch08 巢狀類別 物件導向程式設計(II).
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
Ch03 類別與物件 物件導向系統分析與設計.
Java簡介.
JAVA 程式設計與資料結構 第七章 繼承與Interface.
Java基础 JavaSE异常.
Classes Lecturer: 曾學文.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第六章 类的扩展与继承.
Java 程式設計 講師:FrankLin.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
Ch10 類別與物件-方法 Java程式設計(2).
程式設計實作.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
Managing Inheritance Lecturer:楊昌樺.
類別(class) 類別class與物件object.
Java程序设计 第9章 继承和多态.
程式設計(二) 進階類別 郭文真 Sabrina Kuo.
Ch01 物件與類別複習 物件導向系統實務.
類別的繼承 Vehicle Car.
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
C/C++/Java 哪些值不是头等程序对象
第一單元 建立java 程式.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第 19 章 XML記憶體執行模式.
第二章 Java基本语法 讲师:复凡.
物件導向系統分析與設計 CH04 物件導向開發方法.
物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3
Ch09 物件導向技術導論(二) Java程式設計(2).
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Ch06 抽象類別和多形 物件導向程式設計(2).
OOP9 類別Class.
龍老師我不會Debug QQ.
12 虛擬函數 12.1 多載與超載 12-2 多載函數 12-2 超載函數 虛擬函數 12-6 同名異式 12-7
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
辅导课程十二.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
JAVA 程式設計與資料結構 第三章 物件的設計.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
13 繼承類別 13.1 繼承概論 基礎類別與衍生類別 繼承型式 13-2
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

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

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

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

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

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

Java類別的始祖 所有類別的基礎類別 Object 下列兩行的類別定義方式是相同的: 教學網址:http://java.sun.com/docs/books/tutorial/java/javaOO/index.html 類別list: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html 下列兩行的類別定義方式是相同的: class A {} class A extends Object {}

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

類別的繼承-父類別 父類別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() { } }

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

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

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

範例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

範例1:建立車輛資料(3/4 ) 主程式與子類別Nissan(Ch04_01.java) class Ch04_01 { public static void main(String [] args) Nissan joe = new Nissan(1233567, 1, 680000.0); Nissan jane = new Nissan(5678924, 2, 270000.0); 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

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

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

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

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

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

範例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;

範例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

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

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

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

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

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

範例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

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

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

super-父類別物件之參照

範例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;

範例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

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

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

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

範例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 = 4444444; 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);

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

活動筋骨、大腦時間(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);

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

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

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

實例討論-薪資系統 類別:業務員 類別:一般員工 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("總計: " + 薪水);

實例討論-薪資系統 類別:計時工作人員 類別:主管 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("總計: " + 月薪);

實例討論-薪資系統 類別:計件工作人員 薪資主程式 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

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

實例討論-薪資系統 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("月薪: " + 月薪);

實例討論-薪資系統 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("總計: " + 薪水);

實例討論-薪資系統 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("工資: " + 工資);

實例討論-薪資系統 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("總計: " + 薪水);

實例討論-薪資系統 薪資系統主方法: 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

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