




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、注意:開始用功了注意:開始用功了!Java2實用教程實用教程(第第4版版) 第第5章章子類與繼承子類與繼承 導(dǎo)讀導(dǎo)讀主要內(nèi)容主要內(nèi)容子類與父類子類與父類子類的繼承性子類的繼承性子類與對象子類與對象成員變量的隱藏和方法重寫成員變量的隱藏和方法重寫super關(guān)鍵字關(guān)鍵字final關(guān)鍵字關(guān)鍵字對象的上轉(zhuǎn)型對象對象的上轉(zhuǎn)型對象繼承與多態(tài)繼承與多態(tài)abstract類與類與abstract方法方法面向抽象編程面向抽象編程開開-閉原則閉原則5.1 子類與父類子類與父類 利用繼承,可以先編寫一個共有屬性的一般利用繼承,可以先編寫一個共有屬性的一般類,根據(jù)該一般類再編寫具有特殊屬性的新類,類,根據(jù)該一般類再編寫
2、具有特殊屬性的新類,新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。加它自己的新的狀態(tài)和行為。 由繼承而得到的類稱為由繼承而得到的類稱為子類子類,被繼承的類稱,被繼承的類稱為為父類(超類)父類(超類)。 5.1.1 聲明子類聲明子類 使用關(guān)鍵字使用關(guān)鍵字extends來定義一個類的子類來定義一個類的子類, ,格式如下:格式如下: class 子類名子類名 extends 父類名父類名 例如: class Student extends People 把Student類定義為People類的子類、People類是Student類的父類 5
3、.1.2類的樹形結(jié)構(gòu)類的樹形結(jié)構(gòu) Java的類按繼承關(guān)系形成樹形結(jié)構(gòu)這個樹形結(jié)構(gòu)中,根節(jié)點是Object類 (Object是java.lang包中的類),即Object是所有類的祖先類。 除了Object類每個類有且僅有一個父類有且僅有一個父類,一個類可以有多個或零個子類。如果一個類(除了Object類)的聲明中沒有使用extends關(guān)鍵字,這個類被系統(tǒng)默認為是Object的子類,即類聲明“class A”與“class A extends Object”是等同的。 5.2 子類的繼承性子類的繼承性 所謂子類繼承父類的成員變量作為自己的一個成所謂子類繼承父類的成員變量作為自己的一個成員變量,員
4、變量,就好象它們是在子類中直接聲明一樣就好象它們是在子類中直接聲明一樣,可以,可以被子類中自己定義的任何實例方法操作。被子類中自己定義的任何實例方法操作。所謂子類繼承父類的方法作為子類中的一個方法,所謂子類繼承父類的方法作為子類中的一個方法,就好象它們是在子類中直接定義了一樣就好象它們是在子類中直接定義了一樣,可以被子類,可以被子類中自己定義的任何實例方法調(diào)用。中自己定義的任何實例方法調(diào)用。 5.2.1 子類和父類在同一包中的繼承性子類和父類在同一包中的繼承性 如果子類和父類在同一個包中,那么,子類如果子類和父類在同一個包中,那么,子類自然地自然地繼承了其父類中不是繼承了其父類中不是priva
5、te的成員變量的成員變量作為自己的成員變量,并且也自然地作為自己的成員變量,并且也自然地繼承了父類繼承了父類中不是中不是private的方法的方法作為自己的方法,繼承的作為自己的方法,繼承的成員變量或方法的成員變量或方法的訪問權(quán)限訪問權(quán)限保持不變。保持不變。 下面的例子例子1中有4個類:People,Student.java,UniverStudent.java和Example5_1,這些類都沒有包名(需要分別打開文本編輯器編寫、保存這些類的源文件,比如保存到C:ch5目錄中),其中UniverStudent類是Student的子類,Student是People的子類。程序運行效果如圖5.1。
6、5.2.2 子類和父類不在同一包中的繼承性子類和父類不在同一包中的繼承性 如果子類和父類不在同一個包中,那么,子如果子類和父類不在同一個包中,那么,子類類繼承了父類的繼承了父類的protectedprotected、publicpublic成員變量成員變量做做為 子 類 的 成 員 變 量 , 并 且為 子 類 的 成 員 變 量 , 并 且 繼 承 了 父 類 的繼 承 了 父 類 的protectedprotected、publicpublic方法方法為子類的方法,繼承的為子類的方法,繼承的成員或方法的成員或方法的訪問權(quán)限訪問權(quán)限保持不變。保持不變。 5.2.3 繼承關(guān)系繼承關(guān)系(Gene
7、ralization)的的UML圖圖 如果一個類是另一個如果一個類是另一個類的子類,那么類的子類,那么UMLUML通通過使用一個實線連接兩過使用一個實線連接兩個類的個類的UMLUML圖來表示二圖來表示二者之間的繼承關(guān)系,實者之間的繼承關(guān)系,實線的起始端是子類的線的起始端是子類的UMLUML圖,終點端是父類圖,終點端是父類的的UMLUML圖,但終點端使圖,但終點端使用一個空心的三角形表用一個空心的三角形表示實線的結(jié)束。示實線的結(jié)束。 5.3 子類與對象子類與對象 子類的構(gòu)造方法創(chuàng)建一個子類的對象時,不僅子類的構(gòu)造方法創(chuàng)建一個子類的對象時,不僅子類中聲明的成員變量子類中聲明的成員變量被分配了內(nèi)存,
8、而且父類的成員變量也都分配了內(nèi)存空間,但被分配了內(nèi)存,而且父類的成員變量也都分配了內(nèi)存空間,但只將子類繼承只將子類繼承的那部分成員變量作為分配給子類對象的變量的那部分成員變量作為分配給子類對象的變量 。子類中有一部分方法是從父類繼承的,這部分方法可以操作子類未繼子類中有一部分方法是從父類繼承的,這部分方法可以操作子類未繼承的變量承的變量 。5.3.1 子類對象的特點子類對象的特點 5.3.2 關(guān)于關(guān)于instanceof運算符運算符 instanceof運算符是運算符是Java獨有的雙目運算符,其左面的操作元是對象,右獨有的雙目運算符,其左面的操作元是對象,右面的操作元是類,當(dāng)面的操作元是類,
9、當(dāng)左面的操作元是右面的類或其子類所創(chuàng)建的對象時左面的操作元是右面的類或其子類所創(chuàng)建的對象時,instanceof運算的結(jié)果是運算的結(jié)果是true,否則是否則是false 例子例子2中,子類中,子類ChinaPeople的的對象調(diào)用繼承的方法操作未被子類對象調(diào)用繼承的方法操作未被子類繼承卻分配了內(nèi)存空間的變量。程繼承卻分配了內(nèi)存空間的變量。程序運行效果如圖序運行效果如圖5.3。5.4 成員變量的隱藏和方法重寫成員變量的隱藏和方法重寫 5.4.1 成員變量的隱藏成員變量的隱藏 對于子類可以從父類繼承的成員變量,只要對于子類可以從父類繼承的成員變量,只要子類中聲明的成員變量和父類中的成員變量同子類中
10、聲明的成員變量和父類中的成員變量同名時,子類就隱藏了繼承的成員變量名時,子類就隱藏了繼承的成員變量,子類自,子類自己聲明定義的方法操作與父類同名的成員變量己聲明定義的方法操作與父類同名的成員變量是指子類重新聲明定義的這個成員變量。是指子類重新聲明定義的這個成員變量。 例子例子3(Example5_3.java)中,Goods類有一個名字為weight的double型成員變量,本來子類CheapGoods可以繼承這個成員變量,但是子類CheapGoods又重新聲明了一個int型的名字為weight的成員變量.程序運行效果如圖5.4 . 5.4.2 方法重寫(方法重寫(Override) 子類通過
11、重寫可以隱藏已繼承的實例方法。子類通過重寫可以隱藏已繼承的實例方法。1 1重寫的語法規(guī)則重寫的語法規(guī)則 如果子類可以繼承父類的某個實例方法,那么子類就如果子類可以繼承父類的某個實例方法,那么子類就有權(quán)利重寫這個方法。有權(quán)利重寫這個方法。 方法重寫是指:子類中定義一個方法,這個方法的類方法重寫是指:子類中定義一個方法,這個方法的類型和父類的方法的類型一致或者是父類的方法的類型的型和父類的方法的類型一致或者是父類的方法的類型的子類型,并且這個方法的名字、參數(shù)個數(shù)、參數(shù)的類型子類型,并且這個方法的名字、參數(shù)個數(shù)、參數(shù)的類型和父類的方法完全相同。和父類的方法完全相同。 2 2重寫的目的重寫的目的 子類
12、通過方法的重寫可以隱藏繼承的方法,子類通子類通過方法的重寫可以隱藏繼承的方法,子類通過方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓钸^方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。態(tài)和行為。 在下面的例子在下面的例子4(4(Example5_4.javaExample5_4.java) )中,中,I ImportantUniversity是是University類的子類,子類重寫了父類的類的子類,子類重寫了父類的enterRule()方法,運行效果如圖方法,運行效果如圖5.55.5。 在下面的在下面的例子例子5中,子類中,子類B重寫了父類的重寫了父類的computer()方法,運行效
13、果如圖方法,運行效果如圖5.65.6。 3重寫的注意事項重寫的注意事項 重寫父類的方法時,不允許降低不允許降低方法的訪問權(quán)限,但可以提可以提高訪問權(quán)限高訪問權(quán)限(訪問限制修飾符按訪問權(quán)限從高到低的排列順序是:public、protected、友好的、private。) 4 4JDK1.5JDK1.5對重寫的改進對重寫的改進 在JDK1.5版本之后,允許重寫方法的類型可以是父類方法的類型的子類型類型的子類型,即不必完全一致(JDK1.5版本之前要求必須一致),比如父類的方法的類型是People,重寫方法的類型可以是Student(假設(shè)Student是是People的子類的子類) 例子例子6中,父
14、類的方法是中,父類的方法是Object類型,子類重寫方法的類型是類型,子類重寫方法的類型是Integer類型類型 5.5 supersuper關(guān)鍵字關(guān)鍵字 5.5.1 用用super操作被隱藏的成員變量和方法操作被隱藏的成員變量和方法 子類可以隱藏從父類繼承的成員變量和方法,如果在子類中想使用被子子類可以隱藏從父類繼承的成員變量和方法,如果在子類中想使用被子類隱藏的成員變量或方法就可以使用關(guān)鍵字類隱藏的成員變量或方法就可以使用關(guān)鍵字supersuper。比如比如super.xsuper.x、super.play()super.play()就是訪問和調(diào)用被子類隱藏的成員變量就是訪問和調(diào)用被子類隱
15、藏的成員變量x x和方法和方法play(). play(). 例子例子7中,子類使用中,子類使用super訪問和調(diào)用被子類隱藏的成員變量和方法,訪問和調(diào)用被子類隱藏的成員變量和方法,運行效果如圖運行效果如圖5.7。 5.5.2 使用使用super調(diào)用父類的構(gòu)造方法調(diào)用父類的構(gòu)造方法 子類不繼承父類的構(gòu)造方法,因此,子類如果想使用父類的子類不繼承父類的構(gòu)造方法,因此,子類如果想使用父類的構(gòu)造方法,必須在子類的構(gòu)造方法中使用,并且必須使用關(guān)鍵構(gòu)造方法,必須在子類的構(gòu)造方法中使用,并且必須使用關(guān)鍵字字supersuper來表示,而且來表示,而且supersuper必須是子類構(gòu)造方法中的頭一條語必須是
16、子類構(gòu)造方法中的頭一條語句。句。 例子例子8中,中,UniverStudent是是Student的子類,的子類,UniverStudent子類在構(gòu)子類在構(gòu)造方法中使用了造方法中使用了super關(guān)鍵字,運行效果如圖關(guān)鍵字,運行效果如圖5.8。 5.6 finalfinal關(guān)鍵字關(guān)鍵字 finalfinal關(guān)鍵字可以修飾類、成員變量和方關(guān)鍵字可以修飾類、成員變量和方法中的局部變量。法中的局部變量。 5.6.1 final類類 可以使用可以使用finalfinal將類聲明為將類聲明為finalfinal類。類。finalfinal類不能被繼承,即不能有子類。如:類不能被繼承,即不能有子類。如: fi
17、nal class A final class A 5.6.2 final方法方法 如果用如果用finalfinal修飾父類中的一個方法,那么修飾父類中的一個方法,那么這個方法不允許子類重寫。這個方法不允許子類重寫。 5.6.3 常量常量 如果成員變量或局部變量被修飾為如果成員變量或局部變量被修飾為finalfinal的,的,就是常量。就是常量。 例子例子9 使用了使用了final關(guān)鍵字關(guān)鍵字5.7 對象的上轉(zhuǎn)型對象對象的上轉(zhuǎn)型對象 假設(shè),假設(shè),A A類是類是B B類的父類,當(dāng)用子類創(chuàng)建一個對象,類的父類,當(dāng)用子類創(chuàng)建一個對象,并把這個對象的引用放到父類的對象中時,比如:并把這個對象的引用放到
18、父類的對象中時,比如:A a;A a;a=new B();a=new B(); 或或A a;A a;B b=new B();B b=new B();a=b;a=b; 這時,稱對象這時,稱對象a a是對象是對象b b的上轉(zhuǎn)型對象。的上轉(zhuǎn)型對象。1上轉(zhuǎn)型對象不能操作子類新增的成員變量;不能調(diào)用子類新增的方法。2上轉(zhuǎn)型對象可以訪問子類繼承或隱藏的成員變量,也可以調(diào)用子類繼承的方法或子類重寫的實例方法。上轉(zhuǎn)型對象操作子類繼承的方法或子類重寫的實例方法,其作用等價于子類對象去調(diào)用這些方法。因此,如果子類重寫了父類的某個實例方法后,當(dāng)對象的上轉(zhuǎn)型對象調(diào)用這個實例方法時一定上轉(zhuǎn)型對象調(diào)用這個實例方法時一定是
19、調(diào)用了子類重寫的實例方法是調(diào)用了子類重寫的實例方法。 例子例子1010 中,中,monkeymonkey是是PeoplePeople類型對象的上轉(zhuǎn)型對象,運行效果如圖類型對象的上轉(zhuǎn)型對象,運行效果如圖5.105.10。 5.8 繼承與多態(tài)繼承與多態(tài) 多態(tài)性就是指父類的某個方法被其子類重寫時,可多態(tài)性就是指父類的某個方法被其子類重寫時,可以各自產(chǎn)生自己的功能行為,下面的以各自產(chǎn)生自己的功能行為,下面的例子例子1111展示了多展示了多態(tài),運行效果如圖態(tài),運行效果如圖5.115.11。 5.9 abstractabstract類和類和abstract()abstract()方法方法 用關(guān)鍵字用關(guān)鍵字
20、abstractabstract修飾的類稱為修飾的類稱為abstractabstract類(抽類(抽象類)。如:象類)。如:abstract class A abstract class A 用關(guān)鍵字用關(guān)鍵字abstract修飾的方法稱為修飾的方法稱為abstract方法方法(抽象方法),例如:(抽象方法),例如:abstract int min(int x,int y); abstract int min(int x,int y); 注意:注意:1 1abstractabstract類中可以有類中可以有abstractabstract方法方法 2 2abstractabstract類不能用類
21、不能用newnew運算創(chuàng)建對象運算創(chuàng)建對象 例子例子1212 使用了使用了abstractabstract類類 5.10 面向抽象編程面向抽象編程 在設(shè)計一個程序時,可以通過在在設(shè)計一個程序時,可以通過在abstractabstract類中聲明若干個類中聲明若干個abstractabstract方法,表明方法,表明這些方法在整個系統(tǒng)設(shè)計中的重要性,方法體的內(nèi)容細節(jié)由它的非這些方法在整個系統(tǒng)設(shè)計中的重要性,方法體的內(nèi)容細節(jié)由它的非abstractabstract子類去子類去完成。完成。使用多態(tài)進行程序設(shè)計的核心技術(shù)之一是使用上轉(zhuǎn)型對象,即將使用多態(tài)進行程序設(shè)計的核心技術(shù)之一是使用上轉(zhuǎn)型對象,即將
22、abstractabstract類聲類聲明對象作為其子類的上轉(zhuǎn)型對象,那么這個上轉(zhuǎn)型對象就可以調(diào)用子類重寫的方法。明對象作為其子類的上轉(zhuǎn)型對象,那么這個上轉(zhuǎn)型對象就可以調(diào)用子類重寫的方法。所謂面向抽象編程,是指當(dāng)設(shè)計某種重要的類時,不讓該類面向具體的類,而所謂面向抽象編程,是指當(dāng)設(shè)計某種重要的類時,不讓該類面向具體的類,而是面向抽象類,即所設(shè)計類中的重要數(shù)據(jù)是抽象類聲明的對象,而不是具體類聲明是面向抽象類,即所設(shè)計類中的重要數(shù)據(jù)是抽象類聲明的對象,而不是具體類聲明的對象。的對象。PillarPillar類就是面向抽象類類就是面向抽象類GeometryGeometry,CirleCirle和和R
23、ectangle Rectangle 都是都是GeometryGeometry的子類的子類 Application.java可以用可以用Pillar 類創(chuàng)建出具有矩形底或圓形底的柱體了,程序運行類創(chuàng)建出具有矩形底或圓形底的柱體了,程序運行效果如圖效果如圖5.12。 5.11 開開- -閉原則閉原則 所謂所謂“開開- -閉原則閉原則”(”(Open-Closed Principle)Open-Closed Principle)就是讓設(shè)計的就是讓設(shè)計的系統(tǒng)應(yīng)當(dāng)對擴展開放,對修改關(guān)閉。系統(tǒng)應(yīng)當(dāng)對擴展開放,對修改關(guān)閉。 在設(shè)計系統(tǒng)時,應(yīng)當(dāng)首先考慮到用戶需求的變化,將應(yīng)對用在設(shè)計系統(tǒng)時,應(yīng)當(dāng)首先考慮到用戶需求的變化,將應(yīng)對用戶變化的部分設(shè)計為對擴展開放,而設(shè)計的核心部分是經(jīng)過精戶變化的部分設(shè)計為對擴展開放,而設(shè)計的核心部分是經(jīng)過精心考慮
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CCS 02-2020智能化采煤工作面分類、分級技術(shù)條件與評價指標(biāo)體系
- T/CBMMA 6-2022固體危險廢物焚燒用回轉(zhuǎn)窯
- T/CASTEM 1007-2022技術(shù)經(jīng)理人能力評價規(guī)范
- T/CAS 745-2023鄉(xiāng)村管道天然氣工程技術(shù)規(guī)程
- T/CAQI 22-2016廢水生物增強前處理高效催化反應(yīng)器
- 成都泛微網(wǎng)絡(luò)java開發(fā)面試題及答案
- 電信招聘考試題及答案
- 戶外游戲面試題及答案
- 海洋信息面試題及答案
- 大學(xué)書法統(tǒng)考試題及答案
- 高考期間食品安全
- 2025黑河學(xué)院輔導(dǎo)員考試題庫
- 分娩質(zhì)量管理的相關(guān)制度
- 光伏電廠防洪防汛應(yīng)急預(yù)案演練方案
- 鄉(xiāng)鎮(zhèn)環(huán)境保護工作制度
- 現(xiàn)場實名制管理制度
- 浙江大學(xué)《分子生物學(xué)原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 人教部編版道德與法治八年級下冊:2.2 《加強憲法監(jiān)督 》聽課評課記錄
- 煤礦主通風(fēng)機電控系統(tǒng)變頻改造裝置安裝方案
- 2025年“美好生活民法典相伴”主題宣傳月活動總結(jié)(2篇)
- 移動通信網(wǎng)絡(luò)流量分析與優(yōu)化策略制定
評論
0/150
提交評論