第4篇 子類與繼承.ppt_第1頁
第4篇 子類與繼承.ppt_第2頁
第4篇 子類與繼承.ppt_第3頁
第4篇 子類與繼承.ppt_第4頁
第4篇 子類與繼承.ppt_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四篇子類與繼承 主要內(nèi)容 子類與父類 子類的繼承性 子類對象的特點(diǎn) 成員變量的隱藏和方法重寫 super關(guān)鍵字 final關(guān)鍵字 對象的上轉(zhuǎn)型對象 繼承與多態(tài) abstract類與abstract方法 面向抽象編程 開 閉原則難點(diǎn) 成員變量的隱藏和方法重寫 開 閉原則 1 子類與父類 當(dāng)我們準(zhǔn)備編寫一個(gè)類的時(shí)候 發(fā)現(xiàn)某個(gè)類已經(jīng)有了我們所需要的成員變量和方法 假如我們想復(fù)用這個(gè)類中的成員變量和方法 即在所編寫的類中不用聲明成員變量就相當(dāng)于有了這個(gè)成員變量 不用定義方法就相當(dāng)于有了這個(gè)方法 那么我們可以將編寫的類聲明為這個(gè)類的子類 在類的聲明中 通過使用關(guān)鍵字extends來聲明一個(gè)類的子類 格式如下 class子類名extends父類名 例如 classStudentextendsPeople 1 子類與父類 所謂子類繼承父類的成員變量作為自己的一個(gè)成員變量 就好像它們是在子類中直接聲明一樣 可以被子類中自己定義的任何實(shí)例方法操作所謂子類繼承父類的方法作為子類中的一個(gè)方法 就像它們是在子類中直接定義了一樣 可以被子類中自己定義的任何實(shí)例方法調(diào)用 如果子類中定義的實(shí)例方法不能操作父類的某個(gè)成員變量或方法 那么該成員變量或方法就沒有被子類繼承 子類不僅可以從父類繼承成員變量和方法 而且根據(jù)需要還可以聲明它自己的新成員變量 定義新的方法 2 子類的繼承性 訪問限制修飾符不僅限制了對象對自己成員變量的操作和方法的調(diào)用 也限制了繼承性 當(dāng)子類和父類在同一個(gè)包中時(shí) 子類繼承父類中的除private訪問權(quán)限以外的其他成員變量作為子類的成員變量 子類繼承父類中的除private訪問權(quán)限以外的其他方法作為子類的方法 2 1同一包的繼承性 People javapublicclassPeople doubleheight 170 weight 67 9 protectedvoidtellHeightAndWeight System out printf 我的體重和身高 2 2fkg 2 2fcm n weight height Student javapublicclassStudentextendsPeople intnumber voidtellNumber System out println 我的學(xué)號是 number intadd intx inty returnx y intsub intx inty returnx y UniverStudent javapublicclassUniverStudentextendsStudent intmulti intx inty returnx y doublediv doublex doubley returnx y Example5 1 javapublicclassExample5 1 publicstaticvoidmain Stringargs intx 12 y 18 Studentzhang newStudent zhang weight 73 8 zhang height 177 zhang number 100101 zhang tellHeightAndWeight zhang tellNumber System out print zhang會(huì)做加減 intresult zhang add x y System out printf d d d t x y result result zhang sub x y System out printf d d d n x y result UniverStudentgeng newUniverStudent geng number 6609 geng tellHeightAndWeight geng tellNumber System out print geng會(huì)做加減乘除 result geng add x y System out printf d d d t x y result result geng sub x y System out printf d d d t x y result result geng multi x y System out printf d d d t x y result doublere geng div x y System out printf d d f n x y re 當(dāng)子類和父類不在同一個(gè)包中時(shí) private和友好訪問權(quán)限的成員變量不會(huì)被繼承 子類只繼承父類中的protected和public訪問權(quán)限的成員變量作為子類的成員變量 子類只繼承父類中的protected和public訪問權(quán)限的方法作為子類的方法 2 2不同包的繼承性 一個(gè)類A中的protected成員變量和方法可以被它的直接子類和間接子類繼承 如B是A的子類 C是B的子類 D又是C的子類 那么B C和D類都繼承了A類的protected成員變量和方法 如果用D類在D中創(chuàng)建了一個(gè)對象 那么該對象總是可以通過 運(yùn)算符訪問繼承的或自己定義的protected變量和protected方法的但是 如果在另外一個(gè)類中 如在Other類中用D類創(chuàng)建了一個(gè)對象object 該對象通過 運(yùn)算符訪問protected變量和protected方法的權(quán)限如下列 1 2 所述 2 3protected的說明 1 對于子類D中聲明的protected成員變量和方法 如果object要訪問這些protected成員變量和方法 只要Other類和D類在同一個(gè)包中就可以了 2 如果子類D的對象的protected成員變量或protected方法是從父類繼承的 那么就要一直追溯到該protected成員變量或方法的 祖先 類 即A類 如果Other類和A類在同一個(gè)包中 那么object對象能訪問繼承的protected變量和protected方法 如果一個(gè)類是另一個(gè)類的子類 那么UML通過使用一個(gè)實(shí)線連接兩個(gè)類的UML圖來表示二者之間的繼承關(guān)系 Generalization 實(shí)線的起始端是子類的UML圖 終點(diǎn)端是父類的UML圖 但終點(diǎn)端使用一個(gè)空心的三角形表示實(shí)線的結(jié)束 2 4繼承關(guān)系的UML圖 instanceof是雙目運(yùn)算符 其左面的操作元是對象 右面的操作元是類 當(dāng)左面的操作元是右面的類或子類所創(chuàng)建的對象時(shí) instanceof運(yùn)算的結(jié)果是true 否則是false 例 zhaoqianginstanceofPeople是truezhanginstanceofUniverStudent是false 2 5關(guān)于instanceof運(yùn)算符 當(dāng)用子類的構(gòu)造方法創(chuàng)建一個(gè)子類的對象時(shí) 不僅子類中聲明的成員變量被分配了內(nèi)存 而且父類的成員變量也都分配了內(nèi)存空間 但只將其中一部分 子類繼承的那部分 作為分配給子類對象的變量 父類中的private成員變量盡管分配了內(nèi)存空間 也不作為子類對象的變量 如果子類和父類不在同一包中 盡管父類的友好成員變量分配了內(nèi)存空間 但也不作為子類的成員變量 子類中還有一部分方法是從父類繼承的 這部分方法卻可以操作這部分未繼承的變量 3子類對象的特點(diǎn) A javapublicclassA privateintx publicvoidsetX intx this x x publicintgetX returnx B javapublicclassBextendsA doubley 12 publicvoidsetY inty this y y x 非法 子類沒有繼承x publicdoublegetY returny Example5 2 javapublicclassExample5 2 publicstaticvoidmain Stringargs Bb newB b setX 888 System out println 子類對象未繼承的x的值是 b getX b y 12 678 System out println 子類對象的實(shí)例變量y的值是 b getY 4成員變量的隱藏和方法重寫 在編寫子類時(shí) 如果所聲明的成員變量的名字和從父類繼承來的成員變量的名字相同 聲明的類型可以不同 在這種情況下 子類就會(huì)隱藏掉所繼承的成員變量 即子類對象以及子類自己聲明定義的方法操作與父類同名的成員變量是指子類重新聲明定義的這個(gè)成員變量 需要注意的是 子類對象仍然可以調(diào)用從父類繼承的方法操作隱藏的成員變量 4 1成員變量的隱藏 Goods javapublicclassGoods publicdoubleweight publicvoidoldSetWeight doublew weight w System out println double型的weight weight publicdoubleoldGetPrice doubleprice weight 10 returnprice CheapGoods javapublicclassCheapGoodsextendsGoods publicintweight publicvoidnewSetWeight intw weight w System out println int型的weight weight publicdoublenewGetPrice doubleprice weight 10 returnprice Example5 3 javapublicclassExample5 3 publicstaticvoidmain Stringargs CheapGoodscheapGoods newCheapGoods cheapGoods weight 198 98 是非法的 因?yàn)樽宇悓ο蟮膚eight已經(jīng)不是double型cheapGoods newSetWeight 198 System out println 對象cheapGoods的weight的值是 cheapGoods weight System out println cheapGoods用子類新增的優(yōu)惠方法計(jì)算價(jià)格 cheapGoods newGetPrice cheapGoods oldSetWeight 198 987 子類對象調(diào)用繼承的方法操作隱藏的double型變量weightSystem out println cheapGoods使用繼承的方法 無優(yōu)惠 計(jì)算價(jià)格 cheapGoods oldGetPrice 重寫的語法規(guī)則如果子類可以繼承父類的某個(gè)實(shí)例方法 那么子類就有權(quán)利重寫這個(gè)方法 方法重寫是指 子類中定義一個(gè)方法 這個(gè)方法的類型和父類的方法的類型一致或者是父類的方法的類型的子類型 所謂子類型是指 如果父類的方法的類型是 類 那么允許子類的重寫方法的類型是 子類 并且這個(gè)方法的名字 參數(shù)個(gè)數(shù) 參數(shù)的類型和父類的方法完全相同 子類如此定義的方法稱作子類重寫的方法 不屬于新增的方法 4 2方法重寫 Override 2 重寫的目的子類通過方法的重寫可以隱藏繼承的方法 子類通過方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為 如果父類的方法f可以被子類繼承 子類就有權(quán)利重寫f 一旦子類重寫了父類的方法f 就隱藏了繼承的方法f 那么子類對象調(diào)用方法f調(diào)用的一定是重寫方法f 重寫方法既可以操作繼承的成員變量 繼承的方法 也可以操作子類新聲明的成員變量 新定義的其他方法 但無法操作被子類隱藏的成員變量和方法 如果子類想使用被隱藏的方法或成員變量 必須使用關(guān)鍵字super Example5 5 javaclassA floatcomputer floatx floaty returnx y publicintg intx inty returnx y classBextendsA floatcomputer floatx floaty returnx y publicclassExample5 5 publicstaticvoidmain Stringargs Bb newB doubleresult puter 8 9 b調(diào)用重寫的方法System out println 調(diào)用重寫方法得到的結(jié)果 result intm b g 12 8 b調(diào)用繼承的方法System out println 調(diào)用繼承方法得到的結(jié)果 m 3 JDK1 5對重寫的改進(jìn)在JDK1 5版本之后 允許重寫方法的類型可以是父類方法的類型的子類型 即不必完全一致 JDK1 5版本之前要求必須一致 4 重寫的注意事項(xiàng)重寫父類的方法時(shí) 不可以降低方法的訪問權(quán)限 5super關(guān)鍵字 子類一旦隱藏了繼承的成員變量 那么子類創(chuàng)建的對象就不再擁有該變量 該變量將歸關(guān)鍵字super所有同樣子類一旦隱藏了繼承的方法 那么子類創(chuàng)建的對象就不能調(diào)用被隱藏的方法 該方法的調(diào)用由關(guān)鍵字super負(fù)責(zé) 因此 如果在子類中想使用被子類隱藏的成員變量或方法就需要使用關(guān)鍵字super 5 1用super操作被隱藏的成員變量和方法 Bank javapublicclassBank intsavedMoney intyear doubleinterest publicdoublecomputerInterest interest year 0 035 savedMoney System out printf d元存在銀行 d年的利息 f元 n savedMoney year interest returninterest ConstructionBank javapublicclassConstructionBankextendsBank doubleyear publicdoublecomputerInterest super year int year doubleremainNumber year int year intday int remainNumber 1000 interest puterInterest day 0 0001 savedMoney System out printf d元存在建設(shè)銀行 d年零 d天的利息 f元 n savedMoney super year day interest returninterest BankOfDalian javapublicclassBankOfDalianextendsBank doubleyear publicdoublecomputerInterest super year int year doubleremainNumber year int year intday int remainNumber 1000 interest puterInterest day 0 00012 savedMoney System out printf d元存在大連銀行 d年零 d天的利息 f元 n savedMoney super year day interest returninterest Example5 7 javapublicclassExample5 7 publicstaticvoidmain Stringargs intamount 5000 ConstructionBankbank1 newConstructionBank bank1 savedMoney amount bank1 year 5 216 doubleinterest1 puterInterest BankOfDalianbank2 newBankOfDalian bank2 savedMoney amount bank2 year 5 216 doubleinterest2 puterInterest System out printf 兩個(gè)銀行利息相差 f元 n interest2 interest1 如果子類的構(gòu)造方法沒有明顯地指明使用父類的哪個(gè)構(gòu)造方法 子類就調(diào)用父類的不帶參數(shù)的構(gòu)造方法 即如果在子類的構(gòu)造方法中 沒有明顯地寫出super關(guān)鍵字來調(diào)用父類的某個(gè)構(gòu)造方法 那么默認(rèn)地有 super 子類不繼承父類的構(gòu)造方法 因此 子類在其構(gòu)造方法中需使用super來調(diào)用父類的構(gòu)造方法 而且super必須是子類構(gòu)造方法中的頭一條語句 5 2用super調(diào)用父類的構(gòu)造方法 Card javapublicclassCard Stringtitle Card title 新年快樂 Card Stringtitle this title title publicStringgetTitle returntitle ChristmasCard javapublicclassChristmasCardextendsCard Stringcontent 子類新增的contentChristmasCard Stringtitle Stringcontent super title 調(diào)用父類的構(gòu)造方法 即執(zhí)行Card title this content content publicvoidshowCard System out println getTitle System out printf s content Example5 8 javapublicclassExample5 8 publicstaticvoidmain Stringargs Stringtitle HappyNewYearToYou Stringcontent t牛年耕耘 n t谷穗滿倉 n t出生牛犢 n t喜迎虎年 n ChristmasCardcard newChristmasCard title content card showCard final關(guān)鍵字可以修飾類 成員變量和方法中的局部變量 6final關(guān)鍵字 可以使用final將類聲明為final類 final類不能被繼承 即不能有子類 如 finalclassA A就是一個(gè)final類 將不允許任何類聲明成A的子類 有時(shí)候是出于安全性的考慮 將一些類修飾為final類 例如 Java提供的String類 它對于編譯器和解釋器的正常運(yùn)行有很重要的作用 對它不能輕易改變 它被修飾為final類 6 1final類 如果用final修飾父類中的一個(gè)方法 那么這個(gè)方法不允許子類重寫 也就是說 不允許子類隱藏可以繼承的final方法 老老實(shí)實(shí)繼承 不許做任何篡改 6 2final方法 如果成員變量或局部變量被修飾為final 那么它就是常量 常量在聲明時(shí)沒有默認(rèn)值 所以在聲明常量時(shí)必須指定該常量的值 而且不能再發(fā)生變化 6 3常量 假設(shè) A類是B類的父類 當(dāng)用子類創(chuàng)建一個(gè)對象 并把這個(gè)對象的引用放到父類的對象中時(shí) 如 Aa a newB 或Aa Bb newB a b 這時(shí) 稱對象a是對象b的上轉(zhuǎn)型對象 就像說 美國人是人 對象的上轉(zhuǎn)型對象的實(shí)體是子類負(fù)責(zé)創(chuàng)建的 但上轉(zhuǎn)型對象會(huì)失去原對象的一些屬性和功能 上轉(zhuǎn)型對象相當(dāng)于子類對象的一個(gè) 簡化 對象 7對象的上轉(zhuǎn)型對象 上轉(zhuǎn)型對象具有如下特點(diǎn) 1 上轉(zhuǎn)型對象不能操作子類新增的成員變量 失掉了這部分屬性 2 不能調(diào)用子類新增的方法 失掉了一些功能 3 上轉(zhuǎn)型對象可以訪問子類繼承或隱藏的成員變量 也可以調(diào)用子類繼承的方法或子類重寫的實(shí)例方法 上轉(zhuǎn)型對象操作子類繼承的方法或子類重寫的實(shí)例方法 其作用等價(jià)于子類對象去調(diào)用這些方法 因此 如果子類重寫了父類的某個(gè)實(shí)例方法后 當(dāng)對象的上轉(zhuǎn)型對象調(diào)用這個(gè)實(shí)例方法時(shí)一定是調(diào)用了子類重寫的實(shí)例方法 People javapublicclassPeople intheight doubleweight voidshowBodyMess System out printf n voidmustDoingThing System out println 吃飯 睡覺 飲水 American javapublicclassAmericanextendsPeople voidshowBodyMess System out println bodyHeight height cm bodyWeight weight kg voidspeakEnglish System out println IamAmerian Chinese javapublicclassChineseextendsPeople voidshowBodyMess System out printf 身高 5dcm t體重 3 2fkg n height weight voidspeakChinese System out println 我是中國人 Example5 10 javapublicclassExample5 10 publicstaticvoidmain Stringargs Peoplepeople null AmericanJohnson newAmerican people Johnson people是Johnson對象的上轉(zhuǎn)型對象 people height 187 同于Johnson height 187people weight 78 67 people showBodyMess 等同于Johnson調(diào)用重寫的showBodyMess 方法 people speakEnglish 非法 因?yàn)閟peakEnglish 是子類新增的方法people mustDoingThing Chinesezhang newChinese people zhang people是zhang對象的上轉(zhuǎn)型對象 people height 177 同于zhang height 187people weight 68 59 people showBodyMess 等同于Johnson調(diào)用重寫的showBodyMess 方法 people speakChinese 非法 因?yàn)閟peakChinese 是子類新增的方法people mustDoingThing zhang Chinese people zhang speakChinese 多態(tài)性就是指父類的某個(gè)實(shí)例方法被其子類重寫時(shí) 可以各自產(chǎn)生自己的功能行為 8繼承與多態(tài) classEspecialCar voidcautionSound classPoliceCarextendsEspecialCar voidcautionSound System out println zhua zhua zhua classAmbulanceCarextendsEspecialCar voidcautionSound System out println jiu jiu jiu classFireCarextendsEspecialCar voidcautionSound System out println huo huo huo publicclassExample5 11 publicstaticvoidmain Stringargs EspecialCarcar newPoliceCar car是警車的上轉(zhuǎn)型對象car cautionSound car newAmbulanceCar car是救護(hù)車的上轉(zhuǎn)型對象car cautionSound car newFireCar car是消防車的上轉(zhuǎn)型對象car cautionSound 用關(guān)鍵字abstract修飾的類稱為abstract類 抽象類 如 abstractclassA 用關(guān)鍵字abstract修飾的方法稱為abstract方法 抽象方法 對于abstract方法 只允許聲明 不允許實(shí)現(xiàn) 而且

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論