java程序設(shè)計chap8_第1頁
java程序設(shè)計chap8_第2頁
java程序設(shè)計chap8_第3頁
java程序設(shè)計chap8_第4頁
java程序設(shè)計chap8_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-WesleyJava Software Solutions Foundations of Program DesignSixth Editionby Lewis & LoftusChapter 8: 繼繼承承Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-2繼繼承承 繼承是組織和創(chuàng)建、重用類的基本技術(shù) 第八章重點(diǎn)討論: 從現(xiàn)有類派生新類的問題 P

2、rotected修飾符 創(chuàng)建類層次 抽象類 與繼承有關(guān)的可見性問題 繼承設(shè)計 GUI組件的繼承層次結(jié)構(gòu) 擴(kuò)展適配器類創(chuàng)建監(jiān)聽器 Timer類Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-3Outline創(chuàng)建子類創(chuàng)建子類覆蓋方法覆蓋方法類層次類層次繼承與可見性繼承與可見性繼承設(shè)計繼承設(shè)計繼承與繼承與GUITimer類類Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-4繼繼承承 繼承允許

3、一個軟件開發(fā)人員在已存在類的基礎(chǔ)上開發(fā)出新類 已經(jīng)存在的類稱為父類,或超類 新類稱為子類 子類繼承了父類的所有特性 也就是子類繼承了父類定義的方法和數(shù)據(jù)Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-5繼繼承承 繼承關(guān)系在UML類圖中采用實(shí)心線和空心箭頭表示,描述如下:VehicleVehicleCarCar 繼承的過程是在兩個類之間建立“是一種”( is-a)的關(guān)系,即子類是一種更具體的父類版本Copyright 2009 Pearson Education, Inc. Publishi

4、ng as Pearson Addison-Wesley8-6繼繼承承 程序員可以對原有類進(jìn)行剪裁,包括增加新變量或方法,或者修改繼承的方法 軟件重用是繼承帶來的最基本的好處 通過使用已有的軟件組件來創(chuàng)建新的軟件組件,可以省略很多精力用于設(shè)計,實(shí)現(xiàn)和測試已有的軟件組件Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-7創(chuàng)創(chuàng)建子類建子類 Java語言采用保留字extends 以確立繼承關(guān)系 See Words.java See Book.java See Dictionary.java cla

5、ss Car extends Vehicle / class contentsCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-8Protected修修飾飾符符 可見性修飾符用于控制對類成員的訪問,這種控制也延伸到繼承的過程中 采用private可變修飾符定義的變量和方法不能通過名字被子類引用 一個父類的public方法或變量可以在子類中按名訪問,然而如果為了子類能夠訪問而聲明一個父類public變量,則將違反封裝性的原則 Java提供了第三種可見性修飾符:protected以適應(yīng)繼承Cop

6、yright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-9Protected修修飾飾符符 Protected修飾符允許子類直接引用父類的變量或方法 Protected修飾符相比public可見性提供了更多的封裝性,但是不如private可見性嚴(yán)格 聲明為protected可見性的變量和方法可以由同一包內(nèi)的任何類訪問 附錄E完整解釋了所有java修飾符之間的關(guān)系 在UML圖中,protected成員前加“#”符號表示proteted可見性Copyright 2009 Pearson Education,

7、Inc. Publishing as Pearson Addison-Wesley8-10Words類類圖圖BookBook# pages : int# pages : int+ pageMessage() : void+ pageMessage() : voidDictionaryDictionary- definitions : int- definitions : int+ definitionMessage() : void+ definitionMessage() : voidWordsWords+ main (args : String) : void+ main (args :

8、String) : voidCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-11Super引用引用 構(gòu)造方法不能被繼承,即使它們擁有public可見性 但可以設(shè)想子類可能需要引用父類的構(gòu)造方法 在一個類中可以使用保留字super引用父類,即使用super引用可以訪問父類的成員 See Words2.java See Book2.java See Dictionary2.java Copyright 2009 Pearson Education, Inc. Publishing as Pea

9、rson Addison-Wesley8-12Super引用引用 子類的構(gòu)造器負(fù)責(zé)調(diào)用父類的構(gòu)造器 子類構(gòu)造器的第一行應(yīng)當(dāng)使用super引用以調(diào)用父類的構(gòu)造器 super引用也可以用于引用在父類中聲明的其他變量和方法 Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-13多多繼繼承承 Java 支持單繼承,即子類只能有唯一的父類 多繼承允許一個子類有多個父類 多繼承可能帶來沖突,例如兩個父類的同名變量的情況需要解決 Java不支持多繼承 在大多數(shù)情況,Java可使用接口提供多繼承的最好特性而

10、不會增加歧義性Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-14Outline創(chuàng)建子類創(chuàng)建子類覆蓋方法覆蓋方法類層次類層次繼承與可見性繼承與可見性繼承設(shè)計繼承設(shè)計繼承與繼承與GUITimer類類Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-15覆蓋方法覆蓋方法 子類方法可覆蓋它所繼承的父類方法 覆蓋后子類新方法擁有父類的方法名,但擁有不同的方法體 子類方法優(yōu)先,覆蓋通常發(fā)生在繼承的

11、情況中 調(diào)用方法的對象決定了哪個版本的方法將被實(shí)際執(zhí)行 See Messages.java See Thought.java See Advice.java Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-16覆蓋覆蓋 父類中的方法可以通過super引用顯式調(diào)用 如果一個方法以final修飾符聲明,那么它不能被子類覆蓋 覆蓋的概念可以應(yīng)用到數(shù)據(jù)變量,稱為影子變量 原則上應(yīng)該避免使用影子變量,因?yàn)樗鼤鸫a中的潛在問題Copyright 2009 Pearson Education, In

12、c. Publishing as Pearson Addison-Wesley8-17重重載載 vs. 覆蓋覆蓋 重載主要處理在同一個類中擁有多個相同名字的方法,這些方法擁有不同的參數(shù) 覆蓋主要處理兩個方法,一個位于父類,一個位于子類 重載為不同參數(shù)的同一操作提供定義方法 覆蓋提供了在不同對象類型中定義相同操作的方法Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-18Outline創(chuàng)建子類創(chuàng)建子類覆蓋方法覆蓋方法類層次類層次繼承與可見性繼承與可見性繼承設(shè)計繼承設(shè)計繼承與繼承與GUITime

13、r類類Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-19類類層層次次結(jié)結(jié)構(gòu)構(gòu) 從一個父類派生出的子類還可以是它自己子類的父類,因此繼承關(guān)系發(fā)展為一個類層次結(jié)構(gòu)BusinessBusinessKMartKMartMacysMacysServiceBusinessServiceBusinessKinkosKinkosRetailBusinessRetailBusinessCopyright 2009 Pearson Education, Inc. Publishing as Pearson

14、Addison-Wesley8-20類類層層次次結(jié)結(jié)構(gòu)構(gòu) 同一個父類的兩個子類稱為兄弟類 應(yīng)當(dāng)合理地將類的公共特性保持在盡可能高的類層次級上 繼承機(jī)制具有傳遞性 因此一個子類繼承了它的所有祖先類 不存在任何情況下都是最佳的類層次結(jié)構(gòu)Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-21Object類類 Object類定義在java標(biāo)準(zhǔn)類庫中的 java.lang包 所有的類都由Object類派生 如果一個類的定義中沒有顯式用extends子句從另一個類派生自己,則自動從Object類派生 因

15、此Object類是類層次結(jié)構(gòu)的最終根節(jié)點(diǎn)Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-22Object類類 Object類包含了一些有用的方法,可以被所有類繼承 例如, Object類包含了toString方法的定義 每次我們定義toString方法,我們實(shí)際覆蓋了繼承的定義 Object類中的toString方法返回表示一個對象名字字符串,并且在對象名后跟隨一個唯一表示該對象的數(shù)值Copyright 2009 Pearson Education, Inc. Publishing as

16、Pearson Addison-Wesley8-23Object類類 Object類的Equals方法返回真值如果兩個對象引用實(shí)際上指向相同的對象(二者為別名) 可以覆蓋任何類的equals方法以提供更實(shí)用的方法 String 類定義了equals方法以檢測兩個字符串是否包含相同的字符 String類的設(shè)計者覆蓋了從Object類繼承的equals方法以提供更實(shí)用的版本Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-24抽象類抽象類 抽象類在類層次結(jié)構(gòu)中代表一般性概念 抽象類不能被實(shí)例化

17、在類頭采用修飾符abstract聲明抽象類public abstract class Product / contentsCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-25抽象類抽象類 抽象類通常包含沒有定義的抽象方法(類似接口) 不同于接口,修飾符abstract必須應(yīng)用到每一個抽象方法 一個抽象類通常包含帶有全部定義的非抽象方法 一個類聲明為抽象并不一定要包含抽象方法Copyright 2009 Pearson Education, Inc. Publishing as Pearso

18、n Addison-Wesley8-26抽象類抽象類 抽象類的子類必須覆蓋父類的抽象方法,否則該子類仍然是抽象類 抽象方法不能定義為final 或 static 抽象類的使用是軟件設(shè)計的重要元素,它允許在一個層次結(jié)構(gòu)中建立一個通用元素,而他往往難以實(shí)例化Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-27接口接口層層次次結(jié)結(jié)構(gòu)構(gòu) 繼承的概念可應(yīng)用于接口及類 即一個接口可以另一個接口派生 子接口繼承了父接口的所有抽象方法和常量 任何實(shí)現(xiàn)子接口的類都必須實(shí)現(xiàn)所有的抽象方法 注意類層次和接口層次

19、是截然不同的(它們不會重疊)Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-28Outline創(chuàng)建子類創(chuàng)建子類覆蓋方法覆蓋方法類層次類層次繼承與可見性繼承與可見性繼承設(shè)計繼承設(shè)計繼承與繼承與GUITimer類類Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-29可可見見性性 父類的所有變量和方法甚至私有成員都能被子類繼承 私有成員不能通過名字被子類引用 在子類中即使不能直接引用父類私有

20、成員,但父類私有成員也總是存在,而且能夠間接地引用Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-30可可見見性性 因?yàn)楦割惸軌蛞盟接谐蓡T,子類能夠通過父類的方法間接引用父類私有成員 Super引用可用于引用父類,即使在沒有父類對象存在的情況下 See FoodAnalyzer.java See FoodItem.java See Pizza.java Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison

21、-Wesley8-31Outline創(chuàng)建子類創(chuàng)建子類覆蓋方法覆蓋方法類層次類層次繼承與可見性繼承與可見性繼承設(shè)計繼承設(shè)計繼承與繼承與GUITimer類類Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-32繼繼承承設(shè)計設(shè)計 繼承是面向?qū)ο笤O(shè)計的重要特征 合理設(shè)計繼承關(guān)系可以有效地重用軟件Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-33繼繼承承設(shè)計設(shè)計 每一次的派生都應(yīng)該具有“是一種”

22、關(guān)系 設(shè)計類層次結(jié)構(gòu)有利于現(xiàn)有類的重用和將來潛在的軟件重用 找出類的公共屬性并合理地將公共屬性設(shè)置在盡可能高的類層次上,以實(shí)現(xiàn)類定義的一致性和軟件的易維護(hù)性 覆蓋方法適于增刪和修改子類的功能 可以按需要在子類添加新變量,而不要沖定義任何繼承下來的變量,避免產(chǎn)生影子變量Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-34繼繼承承設(shè)計設(shè)計 要讓每一個類管理自己的數(shù)據(jù),因此應(yīng)使用super調(diào)用父類的構(gòu)造方法,并且適當(dāng)?shù)卣{(diào)用覆蓋方法 即使當(dāng)前暫時沒有需要,也應(yīng)該在子類中適當(dāng)覆蓋通用方法,以免將來被

23、繼承的方法無意中引起問題 使用抽象類為類層次結(jié)構(gòu)中底層的具體類定義公共類接口 慎重使用可見性修飾符,在提供子類所需的訪問控制的同時,不破壞父類的封裝性Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-35繼繼承的限制承的限制 Final修飾符可用于限制繼承 在一個方法聲明中使用final修飾符,使得該方法在任何派生類中不能被覆蓋 如果一個類被final修飾符所聲明,那么該類不能再用于派生新類因此抽象類不能聲明為finalCopyright 2009 Pearson Education, In

24、c. Publishing as Pearson Addison-Wesley8-36Outline創(chuàng)建子類創(chuàng)建子類覆蓋方法覆蓋方法類層次類層次繼承與可見性繼承與可見性繼承設(shè)計繼承設(shè)計繼承與繼承與GUITimer類類Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-37組組件類的件類的層層次次結(jié)結(jié)構(gòu)構(gòu) 定義GUI組件的所有Java類都為層次結(jié)構(gòu)的一部分(圖8.7) 幾乎所有Swing 組件都由Jcomponent類派生, 而 Jcomponent類又由Container類派生 許多Swing

25、組件能夠作為容器,它們由Container 類派生 例如Jlabel對象可以包含 ImageIconCopyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-38組組件類的件類的層層次次結(jié)結(jié)構(gòu)構(gòu) Applet是繼承的一個非常好的例子 當(dāng)定義applet時,我們繼承了 Applet類或者Japplet類 Applet 和Japplet類已經(jīng)處理了所有關(guān)于applet創(chuàng)建和執(zhí)行的細(xì)節(jié), 包括: 與瀏覽器交互從HTML接收applet參數(shù)強(qiáng)制安全限制Copyright 2009 Pearson Educa

26、tion, Inc. Publishing as Pearson Addison-Wesley8-39組組件類的件類的層層次次結(jié)結(jié)構(gòu)構(gòu) 也就是我們的applet代碼只處理與其他applet不同的部分 當(dāng)我們定義了applet的paintComponent方法,我們實(shí)際覆蓋了Jcomponent類和繼承自Japplet類的方法Copyright 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley8-40擴(kuò)展適配器類擴(kuò)展適配器類 繼承也提供了創(chuàng)建監(jiān)聽器類的另外一個技術(shù) 監(jiān)聽器類可以通過實(shí)現(xiàn)特定接口,例如MouseListener 我們也可以通過繼承事件適配器類來創(chuàng)建監(jiān)聽器類 包含多個方法的每個監(jiān)聽器接口都有一個相對應(yīng)的包含了所有方法的空定義的適配器類Copyright 2009

溫馨提示

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

評論

0/150

提交評論