Java課件1第5章 繼承與接口_第1頁
Java課件1第5章 繼承與接口_第2頁
Java課件1第5章 繼承與接口_第3頁
Java課件1第5章 繼承與接口_第4頁
Java課件1第5章 繼承與接口_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

5.1子類與父類

第5章將講述兩方面的重要內(nèi)容:類的繼承與多態(tài),接口的實(shí)現(xiàn)與多態(tài)使用關(guān)鍵字extends來聲明一個(gè)類的子類,格式如下:class子類名extends父類名

{…}例如:classStudentextendsPeople{…}把Student類聲明為People類的子類、People類是Student類的父類如果一個(gè)類的聲明中沒有使用extends關(guān)鍵字,這個(gè)類被系統(tǒng)默認(rèn)為是Object的子類。Object是java.lang包中的類。5.2子類的繼承性

繼承性5.2.1子類和父類在同一包中的繼承性5.1.2子類和父類不在同一包中的繼承性5.1.3protected的進(jìn)一步說明所謂子類繼承父類的成員變量作為自己的一個(gè)成員變量,就好像它們是在子類中直接聲明了一樣,可以被子類中自己定義的任何實(shí)例方法操作,所謂子類繼承父類的方法作為子類中的一個(gè)方法,就像它們是在子類中直接定義了一樣,可以被子類中自己定義的任何實(shí)例方法調(diào)用。也就是說,如果子類中定義的實(shí)例方法不能操作父類的某個(gè)成員變量或方法,那么該成員變量或方法就沒有被子類繼承。子類繼承父類中不是private的成員變量作為自己的成員變量,繼承不是private的方法作為自己的方法,繼承的成員變量或方法的訪問權(quán)限保持不變。子類繼承父類的protected、public成員變量做為子類的成員變量,繼承父類的protected、public方法為子類的方法,繼承的成員或方法的訪問權(quán)限保持不變。如果子類和父類不在同一個(gè)包里,子類不能繼承父類的友好變量和友好方法。例子1Father.javaSon.javaGrandson.javaExample5_1.java5.2子類的繼承性

5.2.1子類和父類在同一包中的繼承性5.1.2子類和父類不在同一包中的繼承性5.1.3protected的進(jìn)一步說明類A中的protected成員變量和方法可以被它的直接子類和間接子類繼承(不要求同包),比如B是A的子類,C是B的子類,D又是C的子類,那么B、C和D類都繼承了A類的protected成員變量和方法。比如在Other類中用D類創(chuàng)建了一個(gè)對象object,該對象通過.運(yùn)算符訪問protected變量和protected方法的權(quán)限如下列(a)、(b)所述:(a)對于子類D中自己聲明的protected成員變量和方法,如果object要訪問protected成員變量和方法,只要Other類和D類在同一個(gè)包中就可以了。(b)如果子類D的對象的protected成員變量或protected方法是從父類繼承的,那么就要一直追溯到該protected成員變量或方法的“祖先”類,即A類,如果Other類和A類在同一個(gè)包中,object對象能訪問繼承的protected變量和protected方法。5.3子類對象的構(gòu)造過程

子類的構(gòu)造方法中總是先調(diào)用父類的某個(gè)構(gòu)造方法,也就是說,如果子類的構(gòu)造方法中沒有明顯地指明使用父類的哪個(gè)構(gòu)造方法,子類就調(diào)用父類的不帶參數(shù)的構(gòu)造方法。用子類創(chuàng)建的對象時(shí),不僅子類中聲明的成員變量被分配了內(nèi)存,而且父類的成員變量也都分配了內(nèi)存空間,但只將其中一部分(子類繼承的那部分)作為分配給子類對象的變量。子類對象內(nèi)存示意圖如圖示意?!安嫣枴北硎咀宇愔新暶鞫x的方法不可以操作這些內(nèi)存單元,“對號”表示子類中聲明定義的方法可以操作這些內(nèi)存單元。子類中有一部分方法是從父類繼承的,這部分方法卻可以操作這部分未繼承的變量。例子2中,子類對象調(diào)用繼承的方法操作這些未被子類繼承卻分配了內(nèi)存空間的變量。例子2A.javaB.javaExample5_2.java5.4成員變量的隱藏和方法重寫

5.4.1成員變量的隱藏5.4.2方法重寫(Override)子類中聲明的成員變量和父類中的成員變量同名時(shí),子類就隱藏了繼承的成員變量,即子類對象以及子類自己聲明定義的方法操作與父類同名的成員變量是指子類重新聲明定義的這個(gè)成員變量。子類對象可以調(diào)用從父類繼承的方法操作隱藏的成員變量。即,如果子類隱藏了繼承的成員變量,繼承的方法只能操作隱藏的成員變量。中,父類People有一個(gè)名字為weight的double型成員變量,子類Student又重新聲明了一個(gè)int型的名字為weight的成員變量,這樣就隱藏了繼承的double型的weight的成員變量。但是,子類對象可以調(diào)用從父類繼承的方法操作隱藏的double型成員變量。程序運(yùn)行效果如圖。例子35.4成員變量的隱藏和方法重寫

5.4.1成員變量的隱藏5.4.2方法重寫(Override)方法重寫是指:子類中定義一個(gè)方法,這個(gè)方法的類型和父類的方法的類型一致或者是父類的方法的類型的子類型(所謂子類型是指:如果父類的方法的類型是“類”,那么允許子類的重寫方法的類型是“子類”),并且這個(gè)方法的名字、參數(shù)個(gè)數(shù)、參數(shù)的類型和父類的方法完全相同。子類如此定義的方法稱作子類重寫的方法。中,子類重寫了父類的方法f,運(yùn)行效果如圖。例子4重寫的目的子類通過方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。一旦子類重寫了父類的方法f,那么子類對象調(diào)用方法f一定是調(diào)用的是重寫方法f。重寫方法既可以操作繼承的成員變量也可以操作子類新聲明的成員變量。如果子類想使用被隱藏的方法,必須使用關(guān)鍵字super,將在5.5節(jié)講述super的用法。子類通過重寫可以隱藏已繼承的實(shí)例方法(方法重寫也稱方法覆蓋)例子5例子5中子類Chinese重寫了父類的createPeople()方法People.javaChinese.javaExample5_5.java5.5super關(guān)鍵字

子類不繼承父類的構(gòu)造方法。如果在子類的構(gòu)造方法中,沒有明顯地寫出super關(guān)鍵字來調(diào)用父類的某個(gè)構(gòu)造方法,那么默認(rèn)地有:super();語句,即調(diào)用父類的不帶參數(shù)的構(gòu)造方法。當(dāng)我們在父類中定義多個(gè)構(gòu)造方法時(shí),應(yīng)當(dāng)包括一個(gè)不帶參數(shù)的構(gòu)造方法(如例子6中的Student類),以防子類省略super時(shí)出現(xiàn)錯(cuò)誤。5.5.1使用super調(diào)用父類的構(gòu)造方法5.5.2使用super操作被隱藏的成員變量和方法子類如果想明確使用父類的構(gòu)造方法,必須在子類的構(gòu)造方法中使用關(guān)鍵字super來調(diào)用父類的構(gòu)造方法,而且super必須是子類構(gòu)造方法中的頭一條語句。例子6中,UniverStudent類的構(gòu)造方法中使用super調(diào)用父類Student的構(gòu)造方法,運(yùn)行效果如圖。例子6Student.javaUniverStudent.javaExample5_6.java5.5super關(guān)鍵字

子類中想使用被子類隱藏的成員變量或方法就可以使用關(guān)鍵字super。比如super.x、super.play()就是訪問和調(diào)用被子類隱藏的成員變量x和方法play()。5.5.1使用super調(diào)用父類的構(gòu)造方法5.5.2使用super操作被隱藏的成員變量和方法當(dāng)super調(diào)用隱藏的方法時(shí),該方法中出現(xiàn)的成員變量是指被隱藏的成員變量(如圖所示)。例子7中,子類Average使用super調(diào)用隱藏的方法,運(yùn)行效果如圖。例子7Sum.javaAverage.javaExample5_7.java5.6final關(guān)鍵字

final類不能被繼承,即不能有子類。5.6.1final類5.6.2final方法5.6.3常量例子8使用了final關(guān)鍵字,運(yùn)行效果如圖。例子8final關(guān)鍵字可以修飾類、成員變量和方法中的局部變量。不允許子類重寫父類的final方法。成員變量或局部變量被修飾為final的,就是常量。常量在聲明時(shí)沒有默認(rèn)值,所以在聲明常量時(shí)必須指定該常量的值,而且不能再發(fā)生變化。5.7對象的上轉(zhuǎn)型對象

上轉(zhuǎn)型對象特點(diǎn)假設(shè),A類是B類的父類,當(dāng)用子類創(chuàng)建一個(gè)對象,并把這個(gè)對象的引用放到父類的對象中時(shí),比如:Aa;a=newB();或Aa;Bb=newB();a=b;這時(shí),稱對象a是對象b的上轉(zhuǎn)型對象.1.上轉(zhuǎn)型對象不能操作子類新增的成員變量(失掉了這部分屬性);不能調(diào)用子類新增的方法(失掉了一些功能)。2.上轉(zhuǎn)型對象可以訪問子類繼承或隱藏的成員變量,也可以調(diào)用子類繼承的方法或子類的重寫方法。上轉(zhuǎn)型對象操作子類繼承的方法或子類重寫的方法,其作用等價(jià)于子類對象去調(diào)用這些方法。因此,如果子類重寫了父類的某個(gè)方法后,當(dāng)對象的上轉(zhuǎn)型對象調(diào)用這個(gè)方法時(shí)一定是調(diào)用了子類重寫的方法。5.7對象的上轉(zhuǎn)型對象

例子9中,Anthropoid(類人猿)類聲明的對象monkey是People類創(chuàng)建的對象people的上轉(zhuǎn)型對象,運(yùn)行效果如圖.①不要將父類創(chuàng)建的對象和子類對象的上轉(zhuǎn)型對象混淆。②可以將對象的上轉(zhuǎn)型對象再強(qiáng)制轉(zhuǎn)換到一個(gè)子類對象,這時(shí),該子類對象又具備了子類所有屬性和功能。③不可以將父類創(chuàng)建的對象的引用賦值給子類聲明的對象Anthropoid.javaPeople.javaExample5_9.java例子95.8繼承與多態(tài)例子10多態(tài)性就是指父類的某個(gè)方法被其子類重寫時(shí),可以各自產(chǎn)生自己的功能行為。當(dāng)一個(gè)類有很多子類時(shí),并且這些子類都重寫了父類中的某個(gè)方法。那么當(dāng)我們把子類創(chuàng)建的對象的引用放到一個(gè)父類的對象中時(shí),就得到了該對象的一個(gè)上轉(zhuǎn)型對象,這個(gè)上轉(zhuǎn)型對象在調(diào)用這個(gè)方法時(shí)就可能具有多種形態(tài),因?yàn)椴煌淖宇愒谥貙懜割惖姆椒〞r(shí)可能產(chǎn)生不同的行為。我們經(jīng)常說:“哺乳動(dòng)物有很多種叫聲”,比如,“吼”、“嚎”、“汪汪”、“喵喵”等,這就是叫聲的多態(tài)。例子10展示了多態(tài),運(yùn)行效果如圖。5.9abstract類

和abstract方法5.9.1abstract類的特點(diǎn)與理解5.9.2abstract類與多態(tài)用關(guān)鍵字abstract修飾的類稱為abstract類(抽象類)。如:abstract

classA{

abstractintmin(intx,inty);}}用關(guān)鍵字abstract修飾的方法稱為abstract方法(抽象方法),對于abstract方法,只允許聲明,不允許實(shí)現(xiàn),而且不允許使用final和abstract同時(shí)修飾一個(gè)方法,例如:

abstractintmin(intx,inty);1.abstract類中可以有abstract方法2.a(chǎn)bstract類不能用new運(yùn)算創(chuàng)建對象3.abstract類的子類如果一個(gè)非abstract類是abstract類的子類,它必須重寫父類的abstract方法,即去掉abstract方法的abstract修飾,并給出方法體。如果一個(gè)abstract類是abstract類的子類,它可以重寫父類的abstract方法,也可以繼承父類的abstract方法4.abstract類的對象作上轉(zhuǎn)型對象可以使用abstract類聲明對象,盡管不能使用new運(yùn)算符創(chuàng)建該對象,但該對象可以成為其子類對象的上轉(zhuǎn)型對象,那么該對象就可以調(diào)用子類重寫的方法。5.9abstract類

和abstract方法5.9.1abstract類的特點(diǎn)與理解5.9.2abstract類與多態(tài)5.理解abstract類抽象類的語法很容易被理解和掌握,但更重要的是理解抽象類的意義,這一點(diǎn)是更為重要的。理解的關(guān)鍵點(diǎn)是:(1)抽象類可以抽象出重要的行為標(biāo)準(zhǔn),該行為標(biāo)準(zhǔn)用抽象方法來表示。即抽象類封裝了子類必需要有的行為標(biāo)準(zhǔn)。(2)抽象類聲明的對象可以成為其子類的對象的上轉(zhuǎn)型對象,調(diào)用子類重寫的方法,即體現(xiàn)子類根據(jù)抽象類里的行為標(biāo)準(zhǔn)給出的具體行為。人們已經(jīng)習(xí)慣給別人介紹數(shù)量標(biāo)準(zhǔn),例如,在介紹人時(shí)候,可以說,人的身高可以是float型的,頭發(fā)的個(gè)數(shù)可以是int型的,比如,介紹人的頭發(fā),強(qiáng)調(diào)數(shù)量類型是int型,但不介紹有多少根頭發(fā)。學(xué)習(xí)了類以后,也要習(xí)慣介紹行為標(biāo)準(zhǔn)。行為標(biāo)準(zhǔn)只需要方法的名字,方法的類型.

一個(gè)男孩要找女朋友,他可以提出一些行為標(biāo)準(zhǔn),比如,女朋友具有speak和cooking行為,但不給出speak和cooking行為的細(xì)節(jié)。例子11使用了abstract類封裝了男孩對女朋友的行為要求,即封裝了他要找的任何具體女朋友都應(yīng)該具有的行為。例子11例子12機(jī)動(dòng)車類的非抽象子類必須給出怎樣啟動(dòng)、加速和剎車的細(xì)節(jié)。5.9abstract類

和abstract方法5.9.1abstract類的特點(diǎn)與理解5.9.2abstract類與多態(tài)使用多態(tài)進(jìn)行程序設(shè)計(jì)的核心技術(shù)之一是使用上轉(zhuǎn)型對象,即將abstract類聲明對象作為其子類的上轉(zhuǎn)型對象,那么這個(gè)上轉(zhuǎn)型對象就可以調(diào)用子類重寫的方法。利用多態(tài)設(shè)計(jì)程序的好處是,可以體現(xiàn)程序設(shè)計(jì)的所謂開-閉原則。開-閉原則強(qiáng)調(diào)一個(gè)程序應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉,增強(qiáng)代碼的可維護(hù)性。比如,程序的主要設(shè)計(jì)者可以設(shè)計(jì)出如圖一種結(jié)構(gòu)關(guān)系,從該圖可以看出,當(dāng)程序再增加一個(gè)子類時(shí),上轉(zhuǎn)型對象所在的類不需要做任何修改,就可以調(diào)用該子類重寫的方法。例子13例子13設(shè)計(jì)了一個(gè)動(dòng)物聲音“模擬器”Animal.javaSimulator.javaDog.javaCat.javaExample5_13.java5.10接口5.10.1接口的定義與使用5.10.2接口回調(diào)5.10.3理解接口5.10.4接口與多態(tài)5.10.5abstract類與接口的比較通過使用關(guān)鍵字interface定義接口,格式:

interface

接口的名字//接口聲明{//接口體}接口體中包含static常量和方法定義兩部分。(1)接口體中的抽象方法和常量JDK8版本之前,接口體中只有抽象方法,訪問權(quán)限一定都是public(允許省略public、abstract修飾符)。所有的static常量的訪問權(quán)限一定都是public(允許省略public、final和static修飾符,接口中不會(huì)有變量)interfacePrintable{

publicstaticfinalintMAX=100;//等價(jià)寫法:intMAX=100;

publicabstractvoidadd();

//等價(jià)寫法:voidadd();

publicabstractfloatsum(floatx,floaty);//等價(jià)寫法:floatsum(floatx,floaty);}5.10接口5.10.1接口的定義與使用5.10.2接口回調(diào)5.10.3理解接口5.10.4接口與多態(tài)5.10.5abstract類與接口的比較(2)接口體中的default實(shí)例方法從JDK8版本開始,允許使用default關(guān)鍵字,在接口體中定義稱作default的實(shí)例方法(不可以定義default的static方法),default的實(shí)例方法和通常的普通的方法比就是用關(guān)鍵字default修飾的帶方法體的實(shí)例方法。default實(shí)例方法的訪問權(quán)限一定是public(允許省略public修飾符)。注意不可以省略default關(guān)鍵字,因?yàn)榻涌诶锊辉试S定義通常的帶方法體的實(shí)例方法。interfacePrintable{

publicfinalintMAX=100;//等價(jià)寫法:intMAX=100;

publicabstractvoidadd();//等價(jià)寫法:voidadd();

publicabstractfloatsum(floatx,floaty);

publicdefaultintmax(inta,intb){//default方法

returna>b?a:b;

}}5.10接口5.10.1接口的定義與使用5.10.2接口回調(diào)5.10.3理解接口5.10.4接口與多態(tài)5.10.5abstract類與接口的比較(3)接口體中的static方法從JDK8版本開始,允許在接口體中定義static方法。注不可以用static和abstract同時(shí)修飾一個(gè)方法。publicinterfacePrintable{publicstaticfinalintMAX=100;//等價(jià)寫法:intMAX=100;publicabstractvoidon();//等價(jià)寫法:voidon();publicabstractfloatsum(floatx,floaty);publicdefaultintmax(inta,intb){//default方法returna>b?a:b;}

publicstaticvoidf(){System.out.println("注意是從JavaSE8開始的");}}接口中的f方法就是static方法。5.10接口5.10.1接口的定義與使用5.10.2接口回調(diào)5.10.3理解接口5.10.4接口與多態(tài)5.10.5abstract類與接口的比較一個(gè)類通過使用關(guān)鍵字

implements聲明自己實(shí)現(xiàn)一個(gè)或多個(gè)接口。如果實(shí)現(xiàn)多個(gè)接口,用逗號隔開接口名,如A類實(shí)現(xiàn)Printable和Addable接口:classAimplementsPrintable,Addable{}一個(gè)類實(shí)現(xiàn)了某個(gè)接口,那么這個(gè)類就自然擁有了接口中的常量,default方法(去掉了default關(guān)鍵字),該類也可以重寫接口中的default方法(注意,重寫時(shí)需要去掉default關(guān)鍵字)。如果一個(gè)非abstract類實(shí)現(xiàn)了某個(gè)接口,那么這個(gè)類必須重寫該接口的所有abstract方法,即去掉abstract修飾給出方法體。特別注意的是,類實(shí)現(xiàn)某接口,但類不擁有接口的static方法。接口中的方法的訪問權(quán)限都是public的,重寫時(shí)不可省略public(否則就降低了訪問權(quán)限,這是不允許的)。

使用了Printable接口。例子14Printable.javaAAA.javaExample5_14.java5.10接口5.10.1接口的定義與使用5.10.2接口回調(diào)5.10.3理解接口5.10.4接口與多態(tài)5.10.5abstract類與接口的比較可以把實(shí)現(xiàn)某一接口的類創(chuàng)建的對象的引用賦給該接口聲明的接口變量中,那么該接口變量就可以調(diào)用被類重寫的接口方法以及接口中的default方法實(shí)際上,當(dāng)接口變量調(diào)用被類重寫的接口方法或接口中的default方法時(shí),就是通知相應(yīng)的對象調(diào)用這個(gè)方法。例子15接口回調(diào)非常類似5.7節(jié)介紹的上轉(zhuǎn)型對象調(diào)用子類的重寫方法使用了接口的回調(diào)技術(shù)5.10接口5.10.1接口的定義與使用5.10.2接口回調(diào)5.10.3理解接口5.10.4接口與多態(tài)5.10.5abstract類與接口的比較(1)接口可以抽象出重要的行為標(biāo)準(zhǔn),該行為標(biāo)準(zhǔn)用抽象方法來表示。(2)可以把實(shí)現(xiàn)接口的類的對象的引用賦值給接口變量,該接口變量可以調(diào)用被該類實(shí)現(xiàn)的接口方法,即體現(xiàn)該類根據(jù)接口里的行為標(biāo)準(zhǔn)給出的具體行為。接口的思想在于它可以要求某些類有相同名稱的方法,但方法的具體內(nèi)容可以不同,即要求這些類實(shí)現(xiàn)接口,以保證這些類一定有接口中所聲明的方法(即所謂的方法綁定)。接口在要求一些類有相同名稱的方法的同時(shí),并不強(qiáng)迫這些類具有相同的父類。

例子16例子16要求MotorVehicles類的子類Taxi和Bus)必須有名稱為brake的方法,但額外要求Taxi類有名字為controlAirTemperature和charge的方法),即要求Taxi實(shí)現(xiàn)兩個(gè)接口,要求客車類有名字為charge的方法,即要求Bus只實(shí)現(xiàn)一個(gè)接口。5.10接口5.10.1接口的定義與使用5.10.2接口回調(diào)5.10.3理解接口5.10.4接口與多態(tài)5.10.5abstract類與接口的比較接口產(chǎn)生的多態(tài)就是指不同的類在實(shí)現(xiàn)同一個(gè)接口時(shí)可能具有不同的實(shí)現(xiàn)方式,那么接口變量在回調(diào)接口方法時(shí)就可能具有多種形態(tài)利用接口也可以體現(xiàn)程序設(shè)計(jì)的開-閉原則,即對擴(kuò)展開放,對修改關(guān)閉。比如,程序的主要設(shè)計(jì)者可以設(shè)計(jì)出如圖的一種結(jié)構(gòu)關(guān)系,當(dāng)程序再增加實(shí)現(xiàn)接口的類,接口變量所在的類不需要做任何修改,就可以回調(diào)類重寫的接口方法。

例子17使用接口進(jìn)行程序設(shè)計(jì)的核心思

溫馨提示

  • 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論