電子教案-第5章_第1頁
電子教案-第5章_第2頁
電子教案-第5章_第3頁
電子教案-第5章_第4頁
電子教案-第5章_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章繼承、接口與泛型

本章導讀1.子類與父類2.子類的繼承性3.子類對象的構造過程4.成員變量隱藏和方法的重寫5.super關鍵字6.final類與final方法7.對象的上轉型對象第5章繼承、接口與泛型8.繼承與多態(tài)9.使用abstract類10.接口11.接口回調(diào)12.內(nèi)部類13.匿名類14.異常類15.泛型類5.1子類與父類上一章我們主要學習了類和對象的有關知識,討論了類的構成(封裝)以及用類創(chuàng)立對象等主要問題; 本章的主要介紹類的繼承、和繼承有關的多態(tài)性以及接口等重要概念。5.1子類與父類子類與父類繼承是一種由已有的類創(chuàng)立新類的機制。 利用繼承,我們可以先創(chuàng)立一個共有屬性的一般類; 根據(jù)該一般類再創(chuàng)立具有特殊屬性的新類,新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。 由繼承而得到的類稱為子類,被繼承的類稱為父類〔超類〕。5.1子類與父類

父類可以是自己編寫的類也可以是java類庫中的類。 利用繼承有利于實現(xiàn)代碼的重復使用,子類只需要添加新的功能代碼即可。 Java不支持多重繼承,即子類只能有一個父類。

使用關鍵字extends來聲明一個類是另外一個類的子類,格式如下:

class子類名extends父類名{…..}5.2子類的繼承性1.繼承的定義所謂類繼承就是子類繼承父類的成員變量和方法作為自己的成員變量和方法,就好象它們是在子類中直接聲明一樣。

當然,子類能否繼承父類的變量和方法還有一定的限制。 繼承規(guī)那么:5.2子類的繼承性2.子類和父類在同一包中的繼承性規(guī)那么如果子類和父類在同一個包中,那么子類自然地繼承了其父類中不是private的成員作為自己的成員。 繼承的成員變量以及方法的訪問權限保持不變。下面我們看一個例子。去掉私有成員5.2子類的繼承性3.子類和父類不在同一包中的繼承規(guī)那么如果子類和父類不在同一個包中,那么子類只能繼承父類的protected、public成員變量和方法; 繼承的成員或方法的訪問權限不變。 如果子類和父類不在同一個包里,子類不能繼承父類的友好變量和友好方法。去掉友好成員+私有成員父類:packageFa;publicclassFather{ privateint

priA=10;

int

friB=20; protectedint

proC=30; publicint

pubD=40;}packageSu;importFa.*;publicclassSunextendsFather{ publicvoidprt(){ //System.out.println(priA); //System.out.println(friB);

System.out.println(proC);

System.out.println(pubD); } publicstaticvoidmain(String[]args){ Suns=newSun();

s.prt(); }}子類5.3子類對象的構造過程當用子類的構造方法創(chuàng)立一個子類的對象時,子類的構造方法總是先調(diào)用父類的某個構造方法。因此,我們可以這樣來理解子類創(chuàng)立的對象:〔1〕將子類中聲明的成員變量做為子類對象的成員變量。5.3子類對象的構造過程〔2〕父類的成員變量也都分配了內(nèi)存空間,但只將其中一局部〔繼承的那局部〕做為子類對象的成員變量。 父類的private成員變量盡管分配了內(nèi)存空間,但它不作為子類的成員變量,即父類的私有成員不歸子類管理。5.3子類對象的構造過程子類對象內(nèi)存示意圖如以下圖

子類未繼承的成員

子類未繼承的成員

引用子類對象

子類繼承的成員

子類繼承的成員

子類聲明的成員

子類聲明的成員5.3子類對象的構造過程上頁示意圖中的“叉號〞表示子類中聲明定義的方法不可以操作這些內(nèi)存單元,“對號〞表示子類中聲明定義的方法可以操作這些內(nèi)存單元。 通過上圖,給我們有感覺好象:子類創(chuàng)立對象時似乎浪費了一些內(nèi)存,因為當用子類創(chuàng)立對象時,父類的成員變量也都分配了內(nèi)存空間,但只將其中一局部做為子類對象的成員變量’ 我們需注意到,子類中還有一局部方法是從父類繼承的,這局部方法卻可以操作這局部變量。下面的例子中,子類對象調(diào)用繼承的方法操作這些未被子類繼承卻分配了內(nèi)存空間的變量。5.4成員變量的隱藏和方法的重寫

1.成員變量的隱藏子類可以隱藏繼承的成員變量,當在子類中定義和父類中同名的成員變量時,子類就隱藏了繼承的成員變量。 下面我們看一個例子,在這個例子中子類隱藏了從父類繼承的double型變量。該程序的運行結果如下:

5.4成員變量的隱藏和方法的重寫

2.方法重寫子類也可以隱藏方法,子類通過方法重寫來隱藏繼承的方法。

方法重寫是指:子類中定義一個方法,并且這個方法的名字、返回類型、參數(shù)個數(shù)和類型與從父類繼承的方法完全相同。 子類通過方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。

下面這個例子可以幫助我們更好的理解方法的重寫。5.4成員變量的隱藏和方法的重寫

需要注意的是:

方法重寫時一定要保證方法的名字、類型、參數(shù)個數(shù)和類型同父類的某個方法完全相同,只有這樣,子類繼承的這個方法才被隱藏。 如果子類在準備隱藏繼承的方法時,參數(shù)個數(shù)或參數(shù)類型與父類的方法不盡相同,那實際上也沒有隱藏繼承的方法,這時子類就出現(xiàn)兩個方法具有相同的名字。下面我們看個例子。程序的運行結果如右圖:5.5Super關鍵字

Super關鍵字有兩種用法:一種用法是子類使用super調(diào)用父類的構造方法,另一種用法是子類使用super調(diào)用被子類隱藏的成員變量和方法。5.5Super關鍵字1.使用super調(diào)用父類的構造方法

子類不繼承父類的構造方法; 因此,子類如果想使用父類的構造方法,必須在子類的構造方法中使用并且必須使用關鍵字super來表示,而且super必須是子類構造方法中的第一條語句。 在下面的例子中,子類的構造方法中使用super調(diào)用父類的構造方法。5.5Super關鍵字

2.使用super操作被隱藏的成員變量和方法

當子類中定義了一個方法,并且這個方法的名字、返回類型、參數(shù)個數(shù)和類型和父類的某個方法完全相同時,子類從父類繼承的這個方法將被隱藏。 如果我們在子類中想使用被子類隱藏的成員變量或方法就可以使用關鍵字super。在下面這個例子中,子類使用super調(diào)用被隱藏的成員變量和方法。其結果如下:5.6final類和final方法final類不能被繼承,即不能有子類,如:finalclassA{…}將一個類聲明為final類一般是由于平安性考慮。

一旦一個方法被修飾為final方法,那么這個方法不能被重寫,即不允許子類通過重寫隱藏繼承的final方法。5.7對象的上轉型對象1.對象的上轉型下面我們就介紹對象的上轉型對象。假設,B是A的子類或間接子類,當我們用子類B創(chuàng)立一個對象,并把這個對象的引用放到A類聲明的對象變量中時,比方:Aa;a=newB(); 那么就稱對象a是子類對象b的上轉型對象5.7對象的上轉型對象 對象a是子類對象b的上轉型對象,對象的上轉型對象的實體是子類對象實體,但上轉型對象會失去子類對象的一些屬性和功能。上轉型對象具有如下特點〔見以下圖所示〕。子類對象子類對象的上轉型對象繼承或隱藏的成員變量繼承或重寫的方法新增的變量新增的方法5.7對象的上轉型對象 可以將對象的上轉型對象再強制轉換到一個子類對象,這時,該子類對象又具備了子類所有屬性和功能。為了更好的理解對象的上轉型,我們先看個例子。

5.8繼承與多態(tài)和繼承有關的多態(tài)性是指父類的某個方法被其子類重寫時,可以產(chǎn)生自己的功能行為,即同一個操作被不同類型對象調(diào)用時可能產(chǎn)生不同的行為。 例如,狗和貓都具有哺乳類的功能:“叫聲〞,當狗操作“叫聲〞時產(chǎn)生的聲音是“汪汪…,而貓操作“叫聲〞時產(chǎn)生的聲音是“喵喵〞,這就是“叫聲〞的多態(tài)。當一個類有很多子類時,并且這些子類都重寫了父類中的某個方法。 當我們把子類創(chuàng)立的對象的引用放到一個父類的對象中時,就得到了該對象的一個上轉型對象,那么這個上轉型對象在調(diào)用這個方法時就可能具有多種形態(tài)。5.8繼承與多態(tài) 因為不同的子類在重寫父類的方法時可能產(chǎn)生不同的行為。也就是說,不同對象的上轉型對象調(diào)用同一方法可能產(chǎn)生不同的行為。下面讓我們看一個例子來更好地了解繼承與多態(tài)和對象的上轉型對象。程序的運行結果如以下圖:返回5.9使用abstract類用關鍵字abstract修飾類稱為abstract類〔抽象類〕。如:abstractclassA{……}abstract類不能用new運算符創(chuàng)立對象,必須產(chǎn)生其子類,由子類創(chuàng)立對象。 假設abstract類的類體中有abstract方法,只允許聲明,而不允許實現(xiàn),而該類的子類必須實現(xiàn)abstract方法,即重寫父類的abstract方法。 一個abstract類只關心子類是否具有某種功能,不關心功能的具體實現(xiàn)。具體實現(xiàn)由子類負責。下面我們看一個例子:5.9使用abstract類 我們可以看到:圓錐、梯形為底的錐; 假設我們不用geometry類和對象的上轉型對象,這里我們至少要使用兩個構造方法。 這里是只涉及圓錐和梯形錐,假設是在有其它很多種形式的錐,這里的工作的量將非常大,這就是我們?yōu)槭裁词褂胊bstract類和對象的上轉型對象。 當然當我們學習接口后我們還可以使用接口實現(xiàn)這種功能。這在后面將詳細介紹。5.10接口Java不支持多繼承性,即一個類只能有一個父類。單繼承性使得Java簡單,易于管理程序。為了克服單繼承的缺點,Java使用了接口,一個類可以實現(xiàn)多個接口。使用關鍵字interface來定義一個接口。接口的定義和類的定義很相似,分為接口的聲明和接口體。1.接口的聲明與使用〔1〕接口通過使用關鍵字interface來聲明,格式:interface接口的名字5.10接口〔2〕接口體接口體中包含常量定義和方法定義兩局部。接口體中只進行方法的聲明,不許提供方法的實現(xiàn),所以,方法的定義沒有方法體,且用分號“;〞結尾?!?〕接口的使用一個類通過使用關鍵字implements聲明自己實現(xiàn)一個或多個接口。如果實現(xiàn)多個接口,用逗號隔開接口名,如:classAimplementsPrintable,Addable5.10接口

如果一個類實現(xiàn)某個接口,那么這個類必須實現(xiàn)該接口的所有方法,即為這些方法提供方法體。 要注意的是,接口中的方法被默認是public和abstract的,接口在聲明方法時可以省略方法前面的public和abstract關鍵字,但是,類在實現(xiàn)接口方法時,一定要用public來修飾。 接口也可以被繼承,即可以通過關鍵字extends聲明一個接口是另一個接口的子接口。現(xiàn)在我們看一個例子來看一看類是如何實現(xiàn)接口的。5.10接口2.接口與多態(tài)的優(yōu)勢接口的語法規(guī)那么很容易記住,但真正理解接口更重要。 為什么要用接口呢?假設轎車、拖拉機、客車都是機動車的子類,其中機動車是一個抽象類。如果機動車中有3個抽象方法:“剎車〞、“收取費用〞、“調(diào)節(jié)溫度〞,那么所有的子類都要實現(xiàn)這3個方法,產(chǎn)生各自的收費或控制溫度的行為。 這顯然不符合人們的思維方法,因為拖拉機可能不需要有“收取費用〞或“調(diào)節(jié)溫度〞的功能; 可能的處理就是去掉機動車的“收取費用〞和“調(diào)節(jié)溫度〞這兩個方法。各個子類自己擴展。這樣,高層次的抽象無法實現(xiàn)拉。5.10接口 Java支持繼承,但不支持多繼承,即一個類只能有一個父類。 單繼承使得程序更加容易維護和健壯; 多繼承使得編程更加靈活,但使用不當會引起混亂. 為了使程序容易維護和健壯,且不失靈活性,Java使用了接口,一個類可以實現(xiàn)多個接口,接口可以增加很多類都需要實現(xiàn)的功能,不同的類可以使用相同的接口,同一個類也可以實現(xiàn)多個接口。 3個抽象方法:“剎車〞、“收取費用〞、“調(diào)節(jié)溫度〞:兩個接口:收取費用〞、“調(diào)節(jié)溫度〞接口和“剎車〞接口;5.11接口的回調(diào)在講述繼承與多態(tài)時,我們通過子類對象的上轉型表達了繼承的多態(tài)性,即把子類創(chuàng)立的對象的引用放到一個父類的對象中時,得到該對象的一個上轉型對象,那么這個上轉型對象在調(diào)用方法時就可能具有多種形態(tài), 不同對象的上轉型對象調(diào)用同一方法可能產(chǎn)生不同的行為。1.接口回調(diào)接口回調(diào)是多態(tài)的另一種表達,接口回調(diào)是指: 可以把使用某一接口的類創(chuàng)立的對象的引用賦給該接口聲明的接口變量中; 那么該接口變量就可以調(diào)用被類實現(xiàn)的接口中的方法; 當接口變量調(diào)用被類實現(xiàn)的接口中的方法時,就是通知相應的對象調(diào)用接口中的相應方法,這一過程稱作對象功能的接口回調(diào)。5.11接口的回調(diào)不同的類在使用同一接口時,可能具有不同的功能表達,即接口的方法體不必相同,因此,接口回調(diào)可能產(chǎn)生不同的行為。下面我們看看使用了接口的回調(diào)技術的例子。2.接口做參數(shù)當一個方法的參數(shù)是一個接口類型時,如果一個類實現(xiàn)了該接口,那么,就可以把該類的實例的引用傳值給該參數(shù),參數(shù)可以回調(diào)類實現(xiàn)的接口方法。下面我們再看一個接口做參數(shù)的例子。

5.12內(nèi)部類

我們已經(jīng)知道:類可以有兩種重要的成員:成員變量和方法,類還可以有一種成員:內(nèi)部類。 Java支持在一個類中聲明另一個類,這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。 內(nèi)部類同類中聲明的方法或成員變量一樣,一個類把內(nèi)部類看作是自己的成員。內(nèi)部類中的也可以調(diào)用外嵌類的成員變量,方法

外嵌類可以聲明內(nèi)部類對象,作為外嵌類的成員。下面讓我們結合這個例子更好的了解內(nèi)部類。5.13匿名類1.和類有關的匿名類當使用類創(chuàng)立對象時,程序允許我們把類體與對象的創(chuàng)立組合在一起;new類名(){類體} 該類體被認為是某類的一個子類去掉類聲明后的類體,稱作匿名類。 匿名類就是一個子類,由于無名可用,所以不可能用匿名類聲明對象,但卻可以直接用匿名類創(chuàng)立一個對象。假設Hello是類,那么以下代碼就是用Hello的一個子類〔匿名類〕創(chuàng)立對象:5.13匿名類newHello(){匿名類的類體}匿名類可以繼承類的方法也可以重寫類的方法。匿名類可以訪問外嵌類中的成員。 匿名類的主要用途就是作為實參向方法的形參傳遞對象引用。下面的例子展示了匿名類的用法。 我們使用匿名類時,必然是在某個類中直接用匿名類創(chuàng)立對象,因此匿名類一定是內(nèi)部類。5.13匿名類2.和接口有關的匿名類假設Computable是一個接口,那么,Java允許直接用接口名和一個類體創(chuàng)立一個匿名對象,此類體被認為是實現(xiàn)了Computable接口的類去掉類聲明后的類體,稱作匿名類。 以下代碼就是用實現(xiàn)了Computable接口的類〔匿名類〕創(chuàng)立對象:newComputable(){實現(xiàn)接口的匿名類的類體}5.13匿名類如果某個方法的參數(shù)是接口類型,那么我們可以使用接口名和類體組合創(chuàng)立一個匿名對象作為實參傳遞給方法的形參,類體必須要實現(xiàn)接口中的全部方法。下面的例子16展示了和接口有關的匿名類的用法。

5.14異常類所謂異常就是程序運行時可能出現(xiàn)一些錯誤,比方試圖翻開一個根本不存在的文件等,異常處理將會改變程序的控制流程,讓程序有時機對錯誤作出處理。 將可能出現(xiàn)的異常操作放在try~catch語句的try局部,當try局部中的某個語句發(fā)生異常后,try局部將立刻結束執(zhí)行,而轉向執(zhí)行相應的catch局部。5.14異常類所以程序可以將發(fā)生異常后的處理放在catch局部。1.try~catch語句try~catch語句的格式如下:try{包含可能發(fā)生異常的語句}catch(ExceptionSubClass1e){}5.14異常類catch(ExceptionSubClass2e){}各個catch參數(shù)中的異常類都是Exception的某個子類,說明try局部可能發(fā)生的異常。下面我們看一個例子,在這個例子中,我們試圖將一個非數(shù)字字符轉變成整形數(shù),這時就發(fā)生NumberFormatException異常。5.14異常類2.自定義異常類1〕我們也可以擴展Exception類定義自己的異常類,然后規(guī)定哪些方法拋出這樣的異常。 2〕一個方法在聲明時可以使用throws關鍵字聲明拋出所要產(chǎn)生的假設干個異常,并在該方法的方法體中具體給出產(chǎn)生異常的操作,即用相應的異常類創(chuàng)立對象; 這樣在方法結束執(zhí)行并拋出所創(chuàng)立的異常對象。 3〕程序必須在try語句中調(diào)用拋出異常的方法。

5.14異常類在下面例子

溫馨提示

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

評論

0/150

提交評論