第05章 子類與繼承_第1頁
第05章 子類與繼承_第2頁
第05章 子類與繼承_第3頁
第05章 子類與繼承_第4頁
第05章 子類與繼承_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章子類與繼承重點和難點主要內(nèi)容主要內(nèi)容子類與父類子類的繼承性子類對象的特點成員變量的隱藏和方法重寫super關(guān)鍵字final關(guān)鍵字對象的上轉(zhuǎn)型對象繼承與多態(tài)abstract類與abstract方法面向抽象編程開-閉原則難點難點成員變量的隱藏和方法重寫開-閉原則5.1 子類與父類當(dāng)我們準(zhǔn)備編寫一個類的時候,發(fā)現(xiàn)某個類已經(jīng)有了我們所需要的成員變量和方法,假如我們想復(fù)用這個類中的成員變量和方法,即在所編寫的類中不用聲明成員變量就相當(dāng)于有了這個成員變量,不用定義方法就相當(dāng)于有了這個方法,那么我們可以將編寫的類聲明為這個類的子類。5.1 子類與父類在類的聲明中,通過使用關(guān)鍵字extends來聲明一個

2、類的子類,格式如下: class 子類名 extends 父類名 如果類聲明語句中沒有extends子句,則該類為java.lang包中的Object的子類5.2 子類的繼承性在子類中,我們可以不用聲明就使用父類的方法和成員變量,稱為繼承子類繼承的父類方法和成員變量可以當(dāng)作自己的方法和成員變量一樣被子類的實例方法使用如果子類中定義的實例方法不能操作父類的某個成員變量或方法,那么該成員變量或方法就沒有被子類繼承。5.2.1 子類和父類在同一包中的繼承性訪問限制修飾符不僅限制了對象對自己成員變量的操作和方法的調(diào)用,也限制了繼承性當(dāng)子類和父類在同一個包中時父類中的private的成員變量和方法不會被

3、子類繼承當(dāng)子類和父類不在同一個包中時父類中的private和friend的成員變量和方法不會被子類繼承5.2.3 protected的進一步說明類A中的protected成員變量和方法可以被它的直接子類和間接子類繼承,如B是A的子類,C是B的子類,D又是C的子類,那么B、C和D類都繼承了A類的protected成員變量和方法。如果用D類在D中創(chuàng)建了一個對象,那么該對象總是可以通過“.”運算符訪問繼承的或自己定義的protected變量和protected方法的5.2.3 protected的進一步說明如果在另外一個類( Other類)中用D類創(chuàng)建了一個對象,該對象通過“.”運算符訪問prote

4、cted變量和protected方法的權(quán)限取決與是否與該變量、方法的所屬類是否在同一個包中對于D中的protected成員變量和方法:只要Other類和D類在同一個包中,Other類就可以訪問這些方法和變量如果D的對象的protected成員變量或方法是從父類繼承的,那么就要一直追溯到該protected成員變量或方法的“祖先”類,即A類,如果Other類和A類在同一個包中,那么object對象能訪問繼承的protected變量和protected方法5.2.4 繼承關(guān)系的UML圖子類父類falsetrue5.2.5 關(guān)于instanceof運算符instanceof是雙目運算符,其左面的操作

5、元是對象,右面的操作元是類,當(dāng)左面的操作元是右面的類或子類所創(chuàng)建的對象時,instanceof運算的結(jié)果是true,否則是false。例如,對于例5-1中的People、Student、UniverStudent類,zhang和zhaoqiang分別是student和univerStudent類的對象,則Zhaoqiang instanceof PeopleZhaoqiang instanceof StudentZhang instanceof StudentZhang instanceof PeopleZhang instanceof UniverStudent5.3 子類對象的特點創(chuàng)建一個

6、子類的對象時,子類和父類的所有成員變量都分配了內(nèi)存空間,但只將其中一部分(子類繼承的那部分)作為分配給子類對象的變量父類中的private成員變量盡管分配了內(nèi)存空間,也不作為子類對象的變量,即子類不繼承父類的私有成員變量。同樣,如果子類和父類不在同一包中,盡管父類的友好成員變量分配了內(nèi)存空間,但也不作為子類的成員變量,即如果子類和父類不在同一包中,子類不繼承父類的友好成員變量。5.3 子類對象的特點子類創(chuàng)建對象時似乎浪費了一些內(nèi)存!(如父類中的private成員變量分配了內(nèi)存空間,但它既不是子類的對象的變量,也不是父類對象的變量,因為還沒有父類對象)這部分內(nèi)存似乎成了垃圾一樣?NO!子類中還有

7、一部分方法是從父類繼承的,這部分方法卻可以操作這部分未繼承的變量。5.4 成員變量的隱藏和方法重寫成員變量的隱藏子類的成員變量名(student.a)=父類的成員變量名(people.a)此時,student類中的方法所操作的變量a是指誰?若子類(student類)的對象想要操作父類的變量(people.a)?Student 的 a變量調(diào)用從父類繼承的方法操作隱藏的成員變量5.4.2 方法重寫(Override)1重寫的語法規(guī)則重寫的語法規(guī)則如果子類可以繼承父類的某個實例方法,那么子類就有權(quán)利重寫這個方法方法重寫:子類中定義一個方法,這個方法的類型和父類的方法的類型一致或者是父類的方法的類型的

8、子類型,并且這個方法的名字、參數(shù)個數(shù)、參數(shù)的類型和父類的方法完全相同。子類如此定義的方法稱作子類重寫的方法(不屬于新增的方法)。5.4.2 方法重寫l2重寫的目的重寫的目的l方法被重寫后,父類的同名方法被隱藏,子類對象調(diào)用方法調(diào)用的是重寫后的方法。l重寫方法既可以操作繼承的成員變量、繼承的方法,也可以操作子類新聲明的成員變量、新定義的其他方法,但無法操作被子類隱藏的成員變量和方法。如果子類想使用被隱藏的方法或成員變量,必須使用關(guān)鍵字superl例如:利用重寫方法對大學(xué)的錄取分?jǐn)?shù)線進行調(diào)整(重寫錄取方法)5.4.2 方法重寫3.JDK 1.5對重寫的改進對重寫的改進在JDK 1.5版本之后,允許

9、重寫方法的類型可以是父類方法的類型的子類型,即不必完全一致(JDK 1.5版本之前要求必須一致),也就是說,如果父類的方法的類型是“類”, 重寫方法的類型可以是“子類”。例如:家用電器類(子類:電視機類、冰箱類),工廠類(擁有方法:制造家電,方法的類型為家用電器類),電視機類和冰箱類都重寫了這個方法,他們的方法類型分別為電視機類和冰箱類,是原有方法類型(家用電器類)的子類(UML圖見圖5.7) 5.4.2 方法重寫4重寫的注意事項重寫的注意事項(1)重寫父類的方法時,不可以降低方法的訪問權(quán)限。例如:該方法在父類中的訪問權(quán)限是protected級別,子類重寫時不允許級別低于protected(示

10、例,P93)(2)重寫方法的時候,要注意類型的包容。示例:子類B重寫了父類的computer()方法。5.4.2 方法重寫如果子類采用如下方式重寫方法,將會出錯Double computer(float x,float y)return x*y;下面可以成功么? Float computer (float x,float y,float z)5.5 super關(guān)鍵字用super操作被隱藏的成員變量和方法在子類中想使用被子類隱藏的成員變量或方法就需要使用關(guān)鍵字super。示例,銀行系統(tǒng)5.5.2 使用super調(diào)用父類的構(gòu)造方法當(dāng)用子類的構(gòu)造方法創(chuàng)建一個子類的對象時,子類的構(gòu)造方法總是先調(diào)用父類

11、的某個構(gòu)造方法如果子類的構(gòu)造方法沒有明顯地指明使用父類的哪個構(gòu)造方法,子類就調(diào)用父類的不帶參數(shù)的構(gòu)造方法,即如果在子類的構(gòu)造方法中,沒有明顯地寫出super關(guān)鍵字來調(diào)用父類的某個構(gòu)造方法,那么默認(rèn)地有: super(); 子類不繼承父類的構(gòu)造方法,因此,子類在其構(gòu)造方法中需使用super來調(diào)用父類的構(gòu)造方法,而且super必須是子類構(gòu)造方法中的頭一條語句。5.6 final關(guān)鍵字final關(guān)鍵字可以修飾類、成員變量和方法中的局部變量一、final類final類不能被繼承,即不能有子類。如: final class A 有時候是出于安全性的考慮,將一些類修飾為final類。例如,Java提供的S

12、tring類,它對于編譯器和解釋器的正常運行有很重要的作用,對它不能輕易改變,它被修飾為final類。5.6 final方法關(guān)鍵字二、fina方法如果用final修飾父類中的一個方法,那么這個方法不允許子類重寫,也就是說,不允許子類隱藏可以繼承的final方法(老老實實繼承,不許做任何篡改)。三、final變量=常量如果成員變量或局部變量被修飾為final,那么它就是常量。常量在聲明時沒有默認(rèn)值,所以在聲明常量時必須指定該常量的值,而且不能再發(fā)生變化。5.7 對象的上轉(zhuǎn)型對象若A類是B類的父類,當(dāng)用B類構(gòu)造一個對象,并把這個對象的引用放到A類的對象中時,稱對象a是對象b的上轉(zhuǎn)型對象(就像說:“

13、美國人是人”)。如: 對象的上轉(zhuǎn)型對象的實體是子類負責(zé)創(chuàng)建構(gòu)造的,但上轉(zhuǎn)型對象會失去子類的一些屬性和功能(上轉(zhuǎn)型對象相當(dāng)于子類對象的一個“簡化”對象)。A a;a=new B();A a;B b=new B();a=b;或5.7 對象的上轉(zhuǎn)型對象上轉(zhuǎn)型對象具有如下特點(1)上轉(zhuǎn)型對象不能操作子類新增的成員變量(失掉了這部分屬性);不能調(diào)用子類新增的方法(失掉了一些功能)(2)上轉(zhuǎn)型對象可以訪問子類繼承或隱藏的成員變量,也可以調(diào)用子類繼承的方法或子類重寫的實例方法,等價于子類對象去調(diào)用這些方法。如果子類重寫了父類的某個實例方法后,當(dāng)對象的上轉(zhuǎn)型對象調(diào)用這個實例方法時一定是調(diào)用了子類重寫的實例方法

14、。5.8 繼承與多態(tài)當(dāng)一個類有很多子類時,并且這些子類都重寫了父類中的某個實例方法,那么當(dāng)我們把子類創(chuàng)建的對象的引用放到一個父類的對象中時,就得到了該對象的一個上轉(zhuǎn)型對象,那么這個上轉(zhuǎn)型對象在調(diào)用這個實例方法時就可能具有多種形態(tài),因為不同的子類在重寫父類的實例方法時可能產(chǎn)生不同的行為。多態(tài)性就是指父類的某個實例方法被其子類重寫時,可以各自產(chǎn)生自己的功能行為。5.9 abstract類和abstract方法用關(guān)鍵字abstract修飾的類稱為abstract類(抽象類)。如: abstract class A 用關(guān)鍵字abstract修飾的方法稱為abstract方法(抽象方法),對于abstr

15、act方法,只允許聲明,不允許實現(xiàn),而且不允許使用final和abstract同時修飾一個方法5.9 abstract類和abstract方法abstract類中可以有類中可以有abstract方法,也可以有非方法,也可以有非abstract方法方法abstract類不能用類不能用new運算創(chuàng)建對象運算創(chuàng)建對象對于abstract類,我們不能使用new運算符創(chuàng)建該類的對象如果一個非抽象類是某個抽象類的子類,那么它必須重寫父類的抽象方法,給出方法體,這就是為什么不允許使用final和abstract同時修飾一個方法的原因。如果一個abstract類是abstract類的子類,它可以重寫父類的ab

16、stract方法,也可以繼承這個abstract方法。5.10 面向抽象編程在設(shè)計程序時,經(jīng)常會使用abstract類,其原因是,abstract類只關(guān)心操作,但不關(guān)心這些操作具體實現(xiàn)的細節(jié),可以使程序的設(shè)計者把主要精力放在程序的設(shè)計上,而不必拘泥于細節(jié)的實現(xiàn)(將這些細節(jié)留給子類的設(shè)計者),即避免設(shè)計者把大量的時間和精力花費在具體的算法上例如,在設(shè)計地圖時,首先考慮地圖最重要的輪廓,不必去考慮諸如城市中的街道牌號等細節(jié),細節(jié)應(yīng)當(dāng)由抽象類的非抽象子類去實現(xiàn),這些子類可以給出具體的實例,來完成程序功能的具體實現(xiàn)。在設(shè)計一個程序時,可以通過在abstract類中聲明若干個abstract方法,表明這

17、些方法在整個系統(tǒng)設(shè)計中的重要性,方法體的內(nèi)容細節(jié)由它的非abstract子類去完成。5.10 面向抽象編程使用多態(tài)進行程序設(shè)計的核心技術(shù)之一是使用上轉(zhuǎn)型對象,即將abstract類聲明對象作為其子類的上轉(zhuǎn)型對象,那么這個上轉(zhuǎn)型對象就可以調(diào)用子類重寫的方法所謂面向抽象編程,是指當(dāng)設(shè)計一個類時,不讓該類面向具體的類,而是面向抽象類,即所設(shè)計類中的重要數(shù)據(jù)是抽象類聲明的對象,而不是具體類聲明的對象。5.10 面向抽象編程示例:我們已經(jīng)有了一個Circle類(P102),該類創(chuàng)建的對象circle調(diào)用getArea()方法可以計算圓的面積,需要設(shè)計一個Pillar類(柱類)實現(xiàn)getVolume()方法計算柱體的體積圓柱體SO EASY,直接創(chuàng)建Circle對象做底非圓柱體,如三角形底的柱體怎么辦?創(chuàng)建一個“底”類(Geometry類)抽象類。你想變成什么底,就對這個抽象類進行實現(xiàn),重寫該抽象類的getArea()方法即可5.11 開-閉原則“開-閉原則”(Open-Closed Principle)就是讓設(shè)計的系統(tǒng)應(yīng)當(dāng)對擴展開放,對修改關(guān)閉增加新的模塊時,不需要修改現(xiàn)有的模塊在設(shè)計系統(tǒng)時,應(yīng)當(dāng)首先考慮到用戶需求的變化,將應(yīng)對用戶變化的部分設(shè)計為對擴展開放,而設(shè)計的核心部分是經(jīng)過精心考慮之后確定下來的基本結(jié)構(gòu),這部分應(yīng)當(dāng)是對修改關(guān)閉的,即不能因

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論