面向?qū)ο蟮腏ava實(shí)現(xiàn)-繼承和多態(tài)_第1頁(yè)
面向?qū)ο蟮腏ava實(shí)現(xiàn)-繼承和多態(tài)_第2頁(yè)
面向?qū)ο蟮腏ava實(shí)現(xiàn)-繼承和多態(tài)_第3頁(yè)
面向?qū)ο蟮腏ava實(shí)現(xiàn)-繼承和多態(tài)_第4頁(yè)
面向?qū)ο蟮腏ava實(shí)現(xiàn)-繼承和多態(tài)_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 2 回顧 在Java程序中,代碼封裝帶給我們的 好處是什么? 舉例說(shuō)明什么是方法重載? Java中的構(gòu)造方法與實(shí)例方法,有什 么區(qū)別? 3 掌握繼承 掌握super關(guān)鍵字 掌握多態(tài) 本章目標(biāo) 4 生活中的繼承1 生活中,繼承的例子隨處可見 動(dòng)物動(dòng)物 食草動(dòng)物食草動(dòng)物食肉動(dòng)物食肉動(dòng)物 誰(shuí)是父類?誰(shuí)是父類? 誰(shuí)是子類?誰(shuí)是子類? 能說(shuō)出繼承的特點(diǎn)嗎?能說(shuō)出繼承的特點(diǎn)嗎? 繼承需要符合的關(guān)系:繼承需要符合的關(guān)系:is-a,父類更通用、子類更具體,父類更通用、子類更具體 5 生活中的繼承2 子類具有父類的一般特性(包括屬性和行 為),以及自身特殊的特性 巴士是汽車嗎?巴士是汽車嗎? 卡車是汽車嗎?卡

2、車是汽車嗎? 出租車是汽車嗎?出租車是汽車嗎? 最大載客數(shù)量最大載客數(shù)量 報(bào)站報(bào)站 引擎數(shù)量引擎數(shù)量 外觀顏色外觀顏色 剎車剎車 加速加速 汽車汽車 最大載重量最大載重量 卸貨卸貨 所屬公司所屬公司 最大載客數(shù)量最大載客數(shù)量 打發(fā)票打發(fā)票 屬性屬性 行為行為 請(qǐng)問:出租車請(qǐng)問:出租車 包含哪些屬性包含哪些屬性 和行為呢?和行為呢? 6 為什么需要繼承1 開發(fā)教員類,其中教員分為Java教員以 及.NET教員,各自的要求如下: Java教員 屬性:姓名、所屬中心屬性:姓名、所屬中心 方法:授課(步驟:打開方法:授課(步驟:打開Eclipse、實(shí)施理論課授課)、實(shí)施理論課授課)、 自我介紹自我介紹

3、 .NET教員 屬性:姓名、所屬中心屬性:姓名、所屬中心 方法:授課(步驟:打開方法:授課(步驟:打開Visual studio 2005、實(shí)施理、實(shí)施理 論課授課)、自我介紹論課授課)、自我介紹 7 請(qǐng)問:以下這個(gè)解決方案中存在著什么問 題? 為什么需要繼承 2 public class DotNetTeacher private String name; / 教員姓名教員姓名 private String school; / 所在中心所在中心 public DotNetTeacher(String myName, String mySchool) name = myName; school

4、 = mySchool; public void giveLession() System.out.println(啟動(dòng)啟動(dòng) Visual Studio 2005); System.out.println(知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問總結(jié)提問); public void introduction() System.out.println(大家好!我是大家好!我是 + school + 的的 + name + .); public class JavaTeacher private String name; / 教員姓名教員姓名 private Str

5、ing school; / 所在中心所在中心 public JavaTeacher(String myName, String mySchool) name = myName; school = mySchool; public void giveLession() System.out.println(啟動(dòng)啟動(dòng) Eclipse); System.out.println(知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問總結(jié)提問); public void introduction() System.out.println(大家好!我是大家好!我是 + school +

6、的的 + name + .); 代碼存在重復(fù),違背了代碼存在重復(fù),違背了“write once, only once”的原則的原則 8 為什么需要繼承 3 如何改進(jìn)?有沒有可能建立繼承關(guān)系,讓 子類自動(dòng)繼承父類的屬性和方法? Java教員是教員嗎?教員是教員嗎? .NET教員是教員嗎?教員是教員嗎? public class Teacher private String name; / 教員姓名教員姓名 private String school; / 所在中心所在中心 public Teacher(String myName, String mySchool) name = myName;

7、school = mySchool; public void giveLesson() System.out.println(知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問總結(jié)提問); public void introduction() System.out.println(大家好!我是大家好!我是 “ + school + 的的 + name + 。); 現(xiàn)在,所有子類中相同的代碼現(xiàn)在,所有子類中相同的代碼 都抽取到父類中了都抽取到父類中了 屬屬 性性 行行 為為 姓名姓名 所在中心所在中心 授課授課 自我介紹自我介紹 教員教員 Java教員教員.NET教員教員

8、9 為什么需要繼承 4-4 public class JavaTeacher2 extends Teacher public JavaTeacher2(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(啟動(dòng)啟動(dòng) Eclipse); super.giveLesson(); public class DotNetTeacher2 extends Teacher public AccpDotNetTeacher2(String myName, Str

9、ing mySchool) super(myName, mySchool); public void giveLesson() System.out.println(啟動(dòng)啟動(dòng) Visual Studio .NET); super.giveLesson(); 使用繼承,可以有效實(shí)現(xiàn)代碼復(fù)用使用繼承,可以有效實(shí)現(xiàn)代碼復(fù)用 子類自動(dòng)繼承父類的屬性子類自動(dòng)繼承父類的屬性 和方法,子類中不再存在和方法,子類中不再存在 重復(fù)代碼重復(fù)代碼 10 如何實(shí)現(xiàn)繼承 1 在Java語(yǔ)言中,用extends關(guān)鍵字來(lái)表示一 個(gè)類繼承了另一個(gè)類,例如: public class JavaTeacher2 extends

10、Teacher /其余代碼省略其余代碼省略 在父類中只定義一些通用的屬性與方法, 例如: public class Teacher private String name; / 教員姓名教員姓名 private String school; / 所在中心所在中心 public Teacher(String myName, String mySchool) /初始化屬性值初始化屬性值 public void giveLesson() /授課方法的具體實(shí)現(xiàn)授課方法的具體實(shí)現(xiàn) public void introduction() /自我介紹方法的具體實(shí)現(xiàn)自我介紹方法的具體實(shí)現(xiàn) 11 如何實(shí)現(xiàn)繼承 2

11、 子類自動(dòng)繼承父類的屬性和方法,子類中 可以定義特定的屬性和方法 public class Teacher private String name; / 教員姓名教員姓名 private String school;/ 所在中心所在中心 public Teacher (String myName, String mySchool) /初始化屬性值初始化屬性值 public void giveLesson() /授課方法的具體實(shí)現(xiàn)授課方法的具體實(shí)現(xiàn) public void introduction() /自我介紹方法的具體實(shí)現(xiàn)自我介紹方法的具體實(shí)現(xiàn) public class JavaTeache

12、r2 extends AccpTeacher public JavaTeacher2(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(啟動(dòng)啟動(dòng)Eclipse); super.giveLesson(); 由于由于giveLesson()方法與方法與 父類的實(shí)現(xiàn)有所不同,因父類的實(shí)現(xiàn)有所不同,因 此重寫了該方法此重寫了該方法 方法重寫:子類和父類的方法具有相同的名稱、參數(shù)列表、返回類型和訪問修飾符方法重寫:子類和父類的方法具有相同的名稱、參數(shù)列表

13、、返回類型和訪問修飾符 父類中的屬性和方法可父類中的屬性和方法可 以被子類繼承以被子類繼承 12 public class JavaTeacher2 extends Teacher public AccpJavaTeacher2(String myName, String mySchool) super(myName, mySchool); 如何實(shí)現(xiàn)繼承 3 子類的構(gòu)造方法中,通過super關(guān)鍵字調(diào)用 父類的構(gòu)造方法 方法重寫后,通過super關(guān)鍵字調(diào)用父類 的方法 public class JavaTeacher2 extends Teacher public void giveLesson

14、() System.out.println(啟動(dòng)啟動(dòng) Eclipse); super.giveLesson(); 通過調(diào)用父類的構(gòu)造方法,通過調(diào)用父類的構(gòu)造方法, 完成對(duì)屬性值的初始化完成對(duì)屬性值的初始化 13 一切類的“祖先”O(jiān)bject 在Java 中,所有的Java類都直接或間接地 繼承了java.lang.Object類 public class MyObject / public class MyObect extends Object / 在在Eclipse中調(diào)用中調(diào)用MyObject 對(duì)象的成員,會(huì)自動(dòng)彈出繼對(duì)象的成員,會(huì)自動(dòng)彈出繼 承自承自O(shè)bject的所有方法的所有方法 14

15、 小結(jié) 1 請(qǐng)編碼實(shí)現(xiàn)動(dòng)物世界的繼承關(guān)系: 動(dòng)物(Animal)具有行為:吃(eat)、 睡覺(sleep) 動(dòng)物包括:兔子(Rabbit),老虎 (Tiger) 這些動(dòng)物吃的行為各不相同(兔子吃草, 老虎吃肉);但睡覺的行為是一致的 請(qǐng)通過繼承實(shí)現(xiàn)以上需求,并編寫測(cè) 試類AnimalTest進(jìn)行測(cè)試 15 為什么需要多態(tài) 1 在教員類的基礎(chǔ)上,開發(fā)一個(gè)類代表總 部,負(fù)責(zé)對(duì)各教員進(jìn)行評(píng)估,評(píng)估內(nèi)容 包括: 1、教員的自我介紹 2、教員的授課 16 為什么需要多態(tài) 2 public class HQ1 public void judge(JavaTeacher2 t) roductio

16、n(); t.giveLesson(); public void judge(DotNetTeacher2 t) roduction(); t.giveLesson(); public static void main(String args) HQ1 hq = new HQ1(); hq.judge(new JavaTeacher2(李明李明,北京中心北京中心“); hq.judge(new DotNetTeacher2(張明張明,天津中心天津中心“); 第一種解決方案 大家好!我是北京中心的李明大家好!我是北京中心的李明. 啟動(dòng)啟動(dòng) Eclipse 知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解 總結(jié)提問

17、總結(jié)提問 大家好!我是天津中心的張明大家好!我是天津中心的張明. 啟動(dòng)啟動(dòng) Visual Studio 2005 知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解 總結(jié)提問總結(jié)提問 控制臺(tái)輸出控制臺(tái)輸出 17 為什么需要多態(tài) 3 現(xiàn)在,升級(jí)教員類,增加一種新類型: DBTeacher,該類型的教員專門負(fù)責(zé)教授 數(shù)據(jù)庫(kù),要求如下: 屬性:姓名、所屬中心 方法:授課(啟動(dòng)Sql Server、實(shí)施理論課授 課)、自我介紹 同時(shí),總部也負(fù)責(zé)對(duì)這類教員進(jìn)行評(píng)估 18 為什么需要多態(tài) 4 如果在第一種解決方案的基礎(chǔ)上去解決, 我們需要如下兩個(gè)步驟: 建立DBTeacher類 修改總部類,增加方法:judge(DBTeacher t

18、) 每增加一種新的教員類型,都要修改總部類,增加相應(yīng)的每增加一種新的教員類型,都要修改總部類,增加相應(yīng)的 judge(評(píng)估評(píng)估)方法,代碼的可擴(kuò)展性及可維護(hù)性極差方法,代碼的可擴(kuò)展性及可維護(hù)性極差 能找到這個(gè)解決方案的弊端嗎?能找到這個(gè)解決方案的弊端嗎? 19 為什么需要多態(tài) 5 第二種解決方案使用多態(tài) public class HQ3 public void judge(Teacher t) roduction(); t.giveLesson(); public static void main(String args) HQ3 hq = new HQ3(); hq.judge(n

19、ew JavaTeacher2(李明李明,北京中心北京中心“); hq.judge(new DotNetTeacher2(張明張明,天津中心天津中心); hq.judge(new DBTeacher(“李嵐李嵐,北京中心北京中心“); 可以接收子類類型可以接收子類類型 根據(jù)實(shí)際創(chuàng)建的對(duì)象根據(jù)實(shí)際創(chuàng)建的對(duì)象 類型調(diào)用相應(yīng)方法類型調(diào)用相應(yīng)方法 大家好!我是北京中心的李明大家好!我是北京中心的李明. 啟動(dòng)啟動(dòng) Eclipse 知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解 總結(jié)提問總結(jié)提問 大家好!我是天津中心的張明大家好!我是天津中心的張明. 啟動(dòng)啟動(dòng) Visual Studio 2005 知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解 總結(jié)提問總

20、結(jié)提問 大家好!我是北京中心的李嵐大家好!我是北京中心的李嵐. 啟動(dòng)啟動(dòng) Sql Server 知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解 總結(jié)提問總結(jié)提問 控制臺(tái)輸出控制臺(tái)輸出 使用多態(tài)之后,當(dāng)需要增加新的子類類型 時(shí),無(wú)需更改總部類,程序的可擴(kuò)展性及 可維護(hù)性增強(qiáng) 20 什么是多態(tài) 簡(jiǎn)單來(lái)說(shuō),多態(tài)是具有表現(xiàn)多種形態(tài)的能 力的特征 同一個(gè)實(shí)現(xiàn)接口,使用不同的實(shí)例而執(zhí)行 不同操作 彩色打印機(jī)彩色打印機(jī) 打印機(jī)打印機(jī) 黑白打印機(jī)黑白打印機(jī) 打印效果:彩色打印效果:彩色 打印效果:黑白打印效果:黑白 打印打印 打印打印 21 public class Teacher public void giveLesson() S

21、ystem.out.println(知識(shí)點(diǎn)講解知識(shí)點(diǎn)講解); System.out.println(總結(jié)提問總結(jié)提問); public class Test public static void main(String args) HQ3 hq = new HQ3(); hq.judge(new DBTeacher(); 3 如何實(shí)現(xiàn)多態(tài) 1、子類重寫父類的方法 2、把父類型作為參數(shù),該父類及其子類對(duì)象作為參數(shù)傳入 3、運(yùn)行時(shí),根據(jù)實(shí)際創(chuàng)建的對(duì)象類型動(dòng)態(tài)決定使用哪個(gè)方法 public class DBTeacher extends Teacher public void giveLesson() System.out.println(啟動(dòng)啟動(dòng) SqlServer); super.giveLesson(); 1 public class HQ3 public void judge(Teacher t) t.giveLesson(); 2 22 小結(jié) 2 請(qǐng)編碼實(shí)現(xiàn)如下需求: 樂器(Instrument)分為:鋼琴(Piano)、小 提琴(Violin) 各種樂器的彈奏( play )方法各不相同 編寫一個(gè)測(cè)試類InstrumentTest,要求: 編寫方法testPlay,對(duì)各種樂器進(jìn)行彈奏測(cè) 試。要依據(jù)樂器的不同

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論