




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第5 5章章 繼承、接口與泛型繼承、接口與泛型n 本章導(dǎo)讀本章導(dǎo)讀n1. 子類與父類n2. 子類的繼承性n3. 子類對(duì)象的構(gòu)造過(guò)程n4. 成員變量隱藏和方法的重寫(xiě)n5. super關(guān)鍵字n6. final類與final方法n7. 對(duì)象的上轉(zhuǎn)型對(duì)象第第5 5章章 繼承、接口與泛型繼承、接口與泛型n8. 繼承與多態(tài)n9. 使用abstract類n10.接口n11.接口回調(diào)n12.內(nèi)部類n13.匿名類n14.異常類n15.泛型類5.1 5.1 子類與父類子類與父類 上一章我們主要學(xué)習(xí)了類和對(duì)象的有關(guān)知識(shí),討論了類的構(gòu)成以及用類創(chuàng)建對(duì)象等主要問(wèn)題,本章的主要介紹類的繼承、和繼承有關(guān)的多態(tài)性以及接口等
2、重要概念。本章還初步介紹了SDK1.5新推出的泛型。 子類與父類子類與父類 繼承是一種由已有的類創(chuàng)建新類的機(jī)制。利用繼承,我們可以先創(chuàng)建一個(gè)共有屬性的一般類,根據(jù)該一般類再創(chuàng)建具有特殊屬性的新類,新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。由繼承而得到的類稱為子類,被繼承的類稱為父類(超類)。 5.1 5.1 子類與父類子類與父類 父類可以是自己編寫(xiě)的類也可以是java類庫(kù)中的類。利用繼承有利于實(shí)現(xiàn)代碼的重復(fù)使用,子類只需要添加新的功能代碼即可。Java不支持多重繼承,即子類只能有一個(gè)父類。 使用關(guān)鍵字extends來(lái)聲明一個(gè)類是另外一個(gè)類的子類,格式如下: class
3、子類名 extends 父類名 . 返回返回5.2 5.2 子類的繼承性子類的繼承性 1繼承的定義 所謂類繼承就是子類繼承父類的成員變量和方法作為自己的成員變量和方法,就好象它們是在子類中直接聲明一樣。當(dāng)然,子類能否繼承父類的變量和方法還有一定的限制。下面對(duì)其進(jìn)行詳細(xì)介紹。 2子類和父類在同一包中的繼承性 如果子類和父類在同一個(gè)包中,那么子類自然地繼承了其父類中不是private的成員變量作為自己的成員變量,并且也自然地繼承了父類中不是private的方法作為自己的方法。繼承的成員變量以及方法的訪問(wèn)權(quán)限保持不變。5.2 5.2 子類的繼承性子類的繼承性下面我們看一個(gè)例子。程序的運(yùn)行結(jié)果見(jiàn)下圖5
4、.2 5.2 子類的繼承性子類的繼承性 3子類和父類不在同一包中的繼承性 如果子類和父類不在同一個(gè)包中,那么子類只能繼承父類的protected、public成員變量和方法,繼承的成員或方法的訪問(wèn)權(quán)限不變。如果子類和父類不在同一個(gè)包里,子類不能繼承父類的友好變量和友好方法。返回返回5.3 5.3 子類對(duì)象的構(gòu)造過(guò)程子類對(duì)象的構(gòu)造過(guò)程 當(dāng)用子類的構(gòu)造方法創(chuàng)建一個(gè)子類的對(duì)象時(shí),子類的構(gòu)造方法總是先調(diào)用父類的某個(gè)構(gòu)造方法,如果子類的構(gòu)造方法沒(méi)有指明使用父類的哪個(gè)構(gòu)造方法,子類就調(diào)用父類的不帶參數(shù)的構(gòu)造方法。因此,我們可以這樣來(lái)理解子類創(chuàng)建的對(duì)象:(1)將子類中聲明的成員變量做為子類對(duì)象的成員變量。
5、子類未繼承的成員 子類未繼承的成員 引用子類對(duì)象 子類繼承的成員 子類繼承的成員 子類聲明的成員 子類聲明的成員圖 (2)父類的成員變量也都分配了內(nèi)存空間,但只將其中一部分(繼承的那部分)做為子類對(duì)象的成員變量。 父類的private成員變量盡管分配了內(nèi)存空間, 但它不作為子類的成5.3 5.3 子類對(duì)象的構(gòu)造過(guò)程子類對(duì)象的構(gòu)造過(guò)程 元變量,即父類的私有成員不歸子類管理。方法的繼承性與成員變量相同。但若子類和父類不在同一包中,盡管父類的友好成員分配了內(nèi)存空間,但也不作為子類的成員。子類對(duì)象內(nèi)存示意圖如下圖 子類未繼承的成員 子類未繼承的成員 引用子類對(duì)象 子類繼承的成員 子類繼承的成員 子類聲
6、明的成員 子類聲明的成員5.3 5.3 子類對(duì)象的構(gòu)造過(guò)程子類對(duì)象的構(gòu)造過(guò)程 上頁(yè)示意圖中的“叉號(hào)”表示子類中聲明定義的方法不可以操作這些內(nèi)存單元,“對(duì)號(hào)”表示子類中聲明定義的方法可以操作這些內(nèi)存單元。 通過(guò)上圖,給我們有感覺(jué)好象:子類創(chuàng)建對(duì)象時(shí)似乎浪費(fèi)了一些內(nèi)存,因?yàn)楫?dāng)用子類創(chuàng)建對(duì)象時(shí),父類的成員變量也都分配了內(nèi)存空間,但只將其中一部分做為子類對(duì)象的成員變量,但實(shí)際情況并非如此,我們需注意到,子類中還有一部分方法是從父類繼承的,這部分方法卻可以操作這部分變量。下面的例子中,子類對(duì)象調(diào)用繼承的方法操作這些未被子類繼承卻分配了內(nèi)存空間的變量。 返回返回5.4 5.4 成員變量的隱藏和方法的重寫(xiě)成
7、員變量的隱藏和方法的重寫(xiě) 1成員變量的隱藏 子類可以隱藏繼承的成員變量,當(dāng)在子類中定義和父類中同名的成員變量時(shí),子類就隱藏了繼承的成員變量,即子類對(duì)象以及子類自己聲明定義的方法操作與父類同名的成員變量。下面我們看一個(gè)例子,在這個(gè)例子中子類隱藏了從父類繼承的double型變量。該程序的運(yùn)行結(jié)果如下: 5.4 5.4 成員變量的隱藏和方法的重寫(xiě)成員變量的隱藏和方法的重寫(xiě) 2方法重寫(xiě) 子類也可以隱藏方法,子類通過(guò)方法重寫(xiě)來(lái)隱藏繼承的方法。方法重寫(xiě)是指:子類中定義一個(gè)方法,并且這個(gè)方法的名字、返回類型、參數(shù)個(gè)數(shù)和類型與從父類繼承的方法完全相同。子類通過(guò)方法的重寫(xiě)可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和
8、行為。這時(shí),如果子類想使用被隱藏的方法,必須使用關(guān)鍵字super,我們將在后面講述super的用法。下面這個(gè)例子可以幫助我們更好的理解方法的重寫(xiě)。5.4 5.4 成員變量的隱藏和方法的重寫(xiě)成員變量的隱藏和方法的重寫(xiě) 需要注意的是:需要注意的是:方法重寫(xiě)時(shí)一定要保證方法的名字、類型、參數(shù)個(gè)數(shù)和類型同父類的某個(gè)方法完全相同,只有這樣,子類繼承的這個(gè)方法才被隱藏。如果子類在準(zhǔn)備隱藏繼承的方法時(shí),參數(shù)個(gè)數(shù)或參數(shù)類型與父類的方法不盡相同,那實(shí)際上也沒(méi)有隱藏繼承的方法,這時(shí)子類就出現(xiàn)兩個(gè)方法具有相同的名字 。下面我們看個(gè)例子。 程序的運(yùn)行結(jié)果如右圖:5.4 5.4 成員變量的隱藏和方法的重寫(xiě)成員變量的隱藏
9、和方法的重寫(xiě) 3訪問(wèn)修飾符protected的進(jìn)一步說(shuō)明 一個(gè)類A中的protected成員變量和方法可以被它的直接子類和間接子類繼承,比如B是A的子類,C是B的子類 ,D又是C的子類,那么B、C和D類都繼承了A的 protected成員變量和方法。如果用D類在D本身中創(chuàng)建了一個(gè)對(duì)象,那么該對(duì)象總是可以通過(guò)“.”運(yùn)算符訪問(wèn)繼承的或自己定義的protected變量和protected方法的,但是,如果在另外一個(gè)類中,比如E類,用D類創(chuàng)建了一個(gè)對(duì)象object,該對(duì)象通過(guò)“.”運(yùn)算符訪問(wèn)protected變量和protected方法的權(quán)限如下列(a)、(b)所述。 5.4 5.4 成員變量的隱藏和
10、方法的重寫(xiě)成員變量的隱藏和方法的重寫(xiě) (a)子類D的protected成員變量和方法,如果不是從父類繼承來(lái)的,object訪問(wèn)這些protected成員變量和方法時(shí),只要E類和D類在同一個(gè)包中就可以了。 (b)如果子類D的對(duì)象的protected成員變量或protected方法是從父類繼承的,那么就要一直追溯到該protected成員變量或方法的“祖先”類,即A類,如果E類和A類在同一個(gè)包中,object對(duì)象能訪問(wèn)繼承的protected變量和protected方法。返回返回5.5 Super 5.5 Super 關(guān)鍵字關(guān)鍵字 Super關(guān)鍵字有兩種用法:一種用法是子類使用super調(diào)用父類的
11、構(gòu)造方法,另一種用法是子類使用super調(diào)用被子類隱藏的成員變量和方法。 1使用super調(diào)用父類的構(gòu)造方法 子類不繼承父類的構(gòu)造方法,因此,子類如果想使用父類的構(gòu)造方法,必須在子類的構(gòu)造方法中使用并且必須使用關(guān)鍵字super來(lái)表示,而且super必須是子類構(gòu)造方法中的第一條語(yǔ)句。在下面的例子中,子類的構(gòu)造方法中使用super調(diào)用父類的構(gòu)造方法。5.5 Super 5.5 Super 關(guān)鍵字關(guān)鍵字 2使用super操作被隱藏的成員變量和方法 當(dāng)子類中定義了一個(gè)方法,并且這個(gè)方法的名字、返回類型、參數(shù)個(gè)數(shù)和類型和父類的某個(gè)方法完全相同時(shí),子類從父類繼承的這個(gè)方法將被隱藏。如果我們?cè)谧宇愔邢胧褂帽?/p>
12、子類隱藏的成員變量或方法就可以使用關(guān)鍵字super 。 在下面這個(gè)例子中,子類使用super調(diào)用被隱藏的成員變量和方法。 其結(jié)果如下:返回返回5.6 final 5.6 final 類和類和finalfinal方法方法 final類不能被繼承,即不能有子類,如: final class A 將一個(gè)類聲明為final類一般是由于安全性考慮。因?yàn)橐坏┮粋€(gè)方法被修飾為final方法,則這個(gè)方法不能被重寫(xiě),即不允許子類通過(guò)重寫(xiě)隱藏繼承的final方法。返回返回5.75.7對(duì)象的上轉(zhuǎn)型對(duì)象對(duì)象的上轉(zhuǎn)型對(duì)象 1對(duì)象的上轉(zhuǎn)型 我們經(jīng)常說(shuō)“老虎是哺乳動(dòng)物”、“狗是哺乳動(dòng)物”等。若哺乳類是老虎類的父類,這樣說(shuō)當(dāng)
13、然正確,但當(dāng)你說(shuō)老虎是哺乳動(dòng)物時(shí),老虎將失掉老虎獨(dú)有的屬性和功能。下面我們就介紹對(duì)象的上轉(zhuǎn)型對(duì)象。 假設(shè),B是A的子類或間接子類,當(dāng)我們用子類B創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象的引用放到A類聲明的對(duì)象中時(shí),比如: A a; a=new B();5.75.7對(duì)象的上轉(zhuǎn)型對(duì)象對(duì)象的上轉(zhuǎn)型對(duì)象 那么就稱對(duì)象a是子類對(duì)象b的上轉(zhuǎn)型對(duì)象,對(duì)象的上轉(zhuǎn)型對(duì)象的實(shí)體是子類負(fù)責(zé)創(chuàng)建的,但上轉(zhuǎn)型對(duì)象會(huì)失去原對(duì)象的一些屬性和功能。上轉(zhuǎn)型對(duì)象具有如下特點(diǎn)(見(jiàn)下圖所示)。 對(duì)象對(duì)象的上轉(zhuǎn)型對(duì)象繼承或隱藏的成員變量繼承或重寫(xiě)的方法新增的變量新增的方法5.75.7對(duì)象的上轉(zhuǎn)型對(duì)象對(duì)象的上轉(zhuǎn)型對(duì)象 (1)上轉(zhuǎn)型對(duì)象不能操作子類聲明
14、定義的成員變量;也不能使用子類聲明定義的方法。 (2)上轉(zhuǎn)型對(duì)象可以操作子類繼承的成員變量和隱藏的成員變量,也可以使用子類繼承的或重寫(xiě)的方法。 (3)上轉(zhuǎn)型對(duì)象不能操作子類新增的方法和成員變量 (4)可以將對(duì)象的上轉(zhuǎn)型對(duì)象再?gòu)?qiáng)制轉(zhuǎn)換到一個(gè)子類對(duì)象,這時(shí),該子類對(duì)象又具備了子類所有屬性和功能。為了更好的理解對(duì)象的上轉(zhuǎn)型,我們先看個(gè)例子。 5.75.7對(duì)象的上轉(zhuǎn)型對(duì)象對(duì)象的上轉(zhuǎn)型對(duì)象 不要將父類創(chuàng)建的對(duì)象和子類對(duì)象的上轉(zhuǎn)型對(duì)象混淆,對(duì)象的上轉(zhuǎn)型對(duì)象的實(shí)體是由子類負(fù)責(zé)創(chuàng)建的,只不過(guò)失掉了一些屬性和功能而已。對(duì)于對(duì)象的上轉(zhuǎn)型的好處我們?cè)诤竺鎸?duì)比介紹。 返回返回5.8 5.8 繼承與多態(tài)繼承與多態(tài) 和
15、繼承有關(guān)的多態(tài)性是指父類的某個(gè)方法被其子類重寫(xiě)時(shí),可以產(chǎn)生自己的功能行為,即同一個(gè)操作被不同類型對(duì)象調(diào)用時(shí)可能產(chǎn)生不同的行為。例如,狗和貓都具有哺乳類的功能:“叫聲”,當(dāng)狗操作“叫聲”時(shí)產(chǎn)生的聲音是“汪汪,而貓操作“叫聲”時(shí)產(chǎn)生的聲音是“喵喵”,這就是“叫聲”的多態(tài)。 當(dāng)一個(gè)類有很多子類時(shí),并且這些子類都重寫(xiě)了父類中的某個(gè)方法。當(dāng)我們把子類創(chuàng)建的對(duì)象的引用放到一個(gè)父類的對(duì)象中時(shí),就得到了該對(duì)象的一個(gè)上轉(zhuǎn)型對(duì)象,那么這個(gè)上轉(zhuǎn)型對(duì)象在調(diào)用這個(gè)方法時(shí)就可能具有多種形態(tài) 。5.8 5.8 繼承與多態(tài)繼承與多態(tài) 因?yàn)椴煌淖宇愒谥貙?xiě)父類的方法時(shí)可能產(chǎn)生不同的行為。也就是說(shuō),不同對(duì)象的上轉(zhuǎn)型對(duì)象調(diào)用同一方
16、法可能產(chǎn)生不同的行為。 下面讓我們看一個(gè)例子來(lái)更好地了解繼承與多態(tài)和對(duì)象的上轉(zhuǎn)型對(duì)象。程序的運(yùn)行結(jié)果如下圖: 返回返回5.9 5.9 使用使用abstract abstract 類類 用關(guān)鍵字abstract修飾類稱為abstract類(抽象類) 。如: abstract class A abstract類不能用new運(yùn)算符創(chuàng)建對(duì)象,必須產(chǎn)生其子類,由子類創(chuàng)建對(duì)象。若abstract類的類體中有abstract方法,只允許聲明,而不允許實(shí)現(xiàn),而該類的子類必須實(shí)現(xiàn)abstract方法,即重寫(xiě)父類的abstract方法。一個(gè)abstract類只關(guān)心子類是否具有某種功能,不關(guān)心功能的具體實(shí)現(xiàn)。具體實(shí)
17、現(xiàn)由子類負(fù)責(zé)。下面我們看一個(gè)例子:5.9 5.9 使用使用abstractabstract類類 現(xiàn)在讓我們來(lái)分析一下上面的例子,在這個(gè)例子中,我們用到了abstract類和對(duì)象的上轉(zhuǎn)型對(duì)象。我們可以看到我們?cè)谝粋€(gè)方法就構(gòu)造了一個(gè)即包含圓錐又包含以梯形為底的錐(Cone(Geometry bottom,double height) ,若我們不用abstract類和對(duì)象的上轉(zhuǎn)型對(duì)象,這里我們至少要使用兩個(gè)構(gòu)造方法。這里是只涉及圓錐和梯形錐,若是在有其它很多種形式的錐,這里的工作的量將非常大,這就是我們?yōu)槭裁词褂胊bstract類和對(duì)象的上轉(zhuǎn)型對(duì)象。當(dāng)然當(dāng)我們學(xué)習(xí)接口后我們還可以使用接口實(shí)現(xiàn)這種功能
18、。這在后面將詳細(xì)介紹。返回返回5.10 5.10 接口接口 Java不支持多繼承性,即一個(gè)類只能有一個(gè)父類。單繼承性使得Java簡(jiǎn)單,易于管理程序。為了克服單繼承的缺點(diǎn),Java使用了接口,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。 使用關(guān)鍵字interface來(lái)定義一個(gè)接口。接口的定義和類的定義很相似,分為接口的聲明和接口體。 1接口的聲明與使用 (1)接口聲明我們?cè)褂藐P(guān)鍵字class來(lái)聲明類,接口通過(guò)使用關(guān)鍵字interface來(lái)聲明,格式: interface 接口的名字 5.10 5.10 接口接口 (2)接口體 接口體中包含常量定義和方法定義兩部分。接口體中只進(jìn)行方法的聲明,不許提供方法的實(shí)現(xiàn),所以
19、,方法的定義沒(méi)有方法體,且用分號(hào)“;”結(jié)尾 。 (3)接口的使用 一個(gè)類通過(guò)使用關(guān)鍵字implements 聲明自己實(shí)現(xiàn)一個(gè)或多個(gè)接口。如果實(shí)現(xiàn)多個(gè)接口,用逗號(hào)隔開(kāi)接口名,如: class A implements Printable,Addable5.10 5.10 接口接口 如果一個(gè)類實(shí)現(xiàn)某個(gè)接口,那么這個(gè)類必須實(shí)現(xiàn)該接口的所有方法,即為這些方法提供方法體。要注意的是,接口中的方法被默認(rèn)是public和abstract的,接口在聲明方法時(shí)可以省略方法前面的public和abstract關(guān)鍵字,但是,類在實(shí)現(xiàn)接口方法時(shí),一定要用public來(lái)修飾。類實(shí)現(xiàn)的接口方法以及接口中的常量可以被類的對(duì)
20、象調(diào)用。 如果父類實(shí)現(xiàn)了某個(gè)接口,則其子類也就自然實(shí)現(xiàn)這個(gè)接口。接口也可以被繼承,即可以通過(guò)關(guān)鍵字extends聲明一個(gè)接口是另一個(gè)接口的子接口。 現(xiàn)在我們看一個(gè)例子來(lái)看一看類是如何實(shí)現(xiàn)接口的。5.10 5.10 接口接口 2接口與多態(tài) 接口的語(yǔ)法規(guī)則很容易記住,但真正理解接口更重要。你可能注意到,在上述例子中如果去掉接口,并把程序中的a.MAX、b.MAX去掉,上述程序的運(yùn)行沒(méi)有任何問(wèn)題。那為什么要用接口呢? 假如轎車、拖拉機(jī)、客車都是機(jī)動(dòng)車的子類,其中機(jī)動(dòng)車是一個(gè)抽象類。如果機(jī)動(dòng)車中有3個(gè)抽象方法:“剎車”、“收取費(fèi)用”、“調(diào)節(jié)溫度”,那么所有的子類都要實(shí)現(xiàn)這3個(gè)方法,產(chǎn)生各自的收費(fèi)或控制
21、溫度的行為。這顯然不符合人們的思維方法,因?yàn)橥侠瓩C(jī)可能不需要有“收取費(fèi)用”或“調(diào)節(jié)溫度”的功能,合理的處理就是去掉機(jī)動(dòng)車的“收取費(fèi)用”和“調(diào)節(jié)溫度”這兩個(gè)方法。如果允許多繼承,轎車5.10 5.10 接口接口 類想具有“調(diào)節(jié)溫度”的功能,轎車類可以是機(jī)動(dòng)車的子類,同時(shí)也是另外一個(gè)具有“調(diào)節(jié)溫度”功能類的子類。多繼承有可能增加了子類的負(fù)擔(dān),因?yàn)檗I車可能從它的多個(gè)父類繼承了一些并不需要的功能。 Java支持繼承,但不支持多繼承,即一個(gè)類只能有一個(gè)父類。單繼承使得程序更加容易維護(hù)和健壯,多繼承使得編程更加靈活,但卻增加了子類的負(fù)擔(dān),使用不當(dāng)會(huì)引起混亂為了使程序容易維護(hù)和健壯,且不失靈活性,Java使
22、用了接口,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,接口可以增加很多類都需要實(shí)現(xiàn)的功能,不同的類可以使用相同的接口,同一個(gè)類也可以實(shí)現(xiàn)多個(gè)接口。 5.10 5.10 接口接口 接口的思想在于它可以增加很多類都需要實(shí)現(xiàn)的功能,使用相同的接口類不一定有繼承關(guān)系,就象各式各樣的商品,它們可能隸屬不同的公司,工商部門要求都必須具有顯示商標(biāo)的功能(實(shí)現(xiàn)同一接口),但商標(biāo)的具體制作由各個(gè)公司自己去實(shí)現(xiàn)。 返回返回5.11 5.11 接口的回調(diào)接口的回調(diào) 在講述繼承與多態(tài)時(shí),我們通過(guò)子類對(duì)象的上轉(zhuǎn)型體現(xiàn)了繼承的多態(tài)性,即把子類創(chuàng)建的對(duì)象的引用放到一個(gè)父類的對(duì)象中時(shí),得到該對(duì)象的一個(gè)上轉(zhuǎn)型對(duì)象,那么這個(gè)上轉(zhuǎn)型對(duì)象在調(diào)用方法時(shí)就
23、可能具有多種形態(tài),不同對(duì)象的上轉(zhuǎn)型對(duì)象調(diào)用同一方法可能產(chǎn)生不同的行為。 1接口回調(diào) 接口回調(diào)是多態(tài)的另一種體現(xiàn),接口回調(diào)是指:可以把使用某一接口的類創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量中,那么該接口變量就可以調(diào)用被類實(shí)現(xiàn)的接口中的方法,當(dāng)接口變量調(diào)用被類實(shí)現(xiàn)的接口中的方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用接口的方法,這一過(guò)程稱作對(duì)象功能的接口回調(diào)。 5.11 5.11 接口的回調(diào)接口的回調(diào) 不同的類在使用同一接口時(shí),可能具有不同的功能體現(xiàn),即接口的方法體不必相同,因此,接口回調(diào)可能產(chǎn)生不同的行為。下面我們看看使用了接口的回調(diào)技術(shù)的例子。 2接口做參數(shù) 當(dāng)一個(gè)方法的參數(shù)是一個(gè)接口類型時(shí),如果一個(gè)類實(shí)
24、現(xiàn)了該接口,那么,就可以把該類的實(shí)例的引用傳值給該參數(shù),參數(shù)可以回調(diào)類實(shí)現(xiàn)的接口方法。下面我們?cè)倏匆粋€(gè)接口做參數(shù)的例子。結(jié)果如下: 返回返回5.12 5.12 內(nèi)部類內(nèi)部類 我們已經(jīng)知道:類可以有兩種重要的成員:成員變量和方法,類還可以有一種成員:內(nèi)部類。 Java支持在一個(gè)類中聲明另一個(gè)類,這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。內(nèi)部類同類中聲明的方法或成員變量一樣,一個(gè)類把內(nèi)部類看作是自己的成員。外嵌類的成員變量在內(nèi)部類中仍然有效,內(nèi)部類中的方法也可以調(diào)用外嵌類中的方法。內(nèi)部類的類體中不可以聲明類變量和類方法。外嵌類可以用內(nèi)部類聲明對(duì)象,作為外嵌類的成員。下面讓我們結(jié)合這個(gè)
25、例子更好的了解內(nèi)部類。返回返回5.13 5.13 匿名類匿名類 1和類有關(guān)的匿名類 當(dāng)使用類創(chuàng)建對(duì)象時(shí),程序允許我們把類體與對(duì)象的創(chuàng)建組合在一起,也就是說(shuō),類創(chuàng)建對(duì)象時(shí),除了構(gòu)造方法還有類體,此類體被認(rèn)為是該類的一個(gè)子類去掉類聲明后的類體,稱作匿名類。匿名類就是一個(gè)子類,由于無(wú)名可用,所以不可能用匿名類聲明對(duì)象,但卻可以直接用匿名類創(chuàng)建一個(gè)對(duì)象。假設(shè)Hello是類,那么下列代碼就是用Hello的一個(gè)子類(匿名類)創(chuàng)建對(duì)象:5.13 5.13 匿名類匿名類 new Hello () 匿名類的類體 匿名類可以繼承類的方法也可以重寫(xiě)類的方法。我們使用匿名類時(shí),必然是在某個(gè)類中直接用匿名類創(chuàng)建對(duì)象,因
26、此匿名類一定是內(nèi)部類,匿名類可以訪問(wèn)外嵌類中的成員變量和方法,匿名類不可以聲明static成員變量和static方法。匿名類的主要用途就是向方法的參數(shù)傳值。下面的例子展示了匿名類的用法。 5.13 5.13 匿名類匿名類 2和接口有關(guān)的匿名類 假設(shè)Computable是一個(gè)接口,那么,Java允許直接用接口名和一個(gè)類體創(chuàng)建一個(gè)匿名對(duì)象,此類體被認(rèn)為是實(shí)現(xiàn)了Computable接口的類去掉類聲明后的類體,稱作匿名類。下列代碼就是用實(shí)現(xiàn)了Computable接口的類(匿名類)創(chuàng)建對(duì)象: new Computable() 實(shí)現(xiàn)接口的匿名類的類體 5.13 5.13 匿名類匿名類 如果某個(gè)方法的參數(shù)是
27、接口類型,那么我們可以使用接口名和類體組合創(chuàng)建一個(gè)匿名對(duì)象傳遞給方法的參數(shù),類體必須要實(shí)現(xiàn)接口中的全部方法。 下面的例子16展示了和接口有關(guān)的匿名類的用法。 程序的運(yùn)行結(jié)果如下:返回返回5.14 5.14 異常類異常類 所謂異常就是程序運(yùn)行時(shí)可能出現(xiàn)一些錯(cuò)誤,比如試圖打開(kāi)一個(gè)根本不存在的文件等,異常處理將會(huì)改變程序的控制流程,讓程序有機(jī)會(huì)對(duì)錯(cuò)誤作出處理。這一章將對(duì)異常給出初步的介紹,而Java程序中出現(xiàn)的具體異常問(wèn)題在相應(yīng)的章節(jié)中還將講述。 當(dāng)程序運(yùn)行出現(xiàn)異常時(shí),Java運(yùn)行環(huán)境就用異常類Exception的相應(yīng)子類創(chuàng)建一個(gè)異常對(duì)象,并等待處理 Java 使用trycatch語(yǔ)句來(lái)處理異常,將
28、可能出現(xiàn)的異常操作放在trycatch語(yǔ)句的try部分,當(dāng)try部分中的某個(gè)語(yǔ)句發(fā)生異常后,try部分將立刻結(jié)束執(zhí)行,而轉(zhuǎn)向執(zhí)行相應(yīng)的catch部分; 5.14 5.14 異常類異常類 所以程序可以將發(fā)生異常后的處理放在 catch部分。 1trycatch語(yǔ)句trycatch語(yǔ)句的格式如下:try 包含可能發(fā)生異常的語(yǔ)句 catch(ExceptionSubClass1 e) 5.14 5.14 異常類異常類 catch(ExceptionSubClass2 e) 各個(gè)catch參數(shù)中的異常類都是Exception的某個(gè)子類,表明 try部分可能發(fā)生的異常,這些子類之間不能有父子關(guān)系,否則保
29、留一個(gè)含有父類參數(shù)的catch即可。 下面我們看一個(gè)例子,在這個(gè)例子中,我們?cè)噲D將一個(gè)非數(shù)字字符轉(zhuǎn)變成整形數(shù),這時(shí)就發(fā)生NumberFormatException異常 。我們把可能出現(xiàn)異常的操作放在trycatch語(yǔ)句中,就可實(shí)現(xiàn)相應(yīng)的操作。5.14 5.14 異常類異常類 2自定義異常類 我們也可以擴(kuò)展Exception類定義自己的異常類,然后規(guī)定哪些方法產(chǎn)生這樣的異常。一個(gè)方法在聲明時(shí)可以使用throws關(guān)鍵字聲明拋出所要產(chǎn)生的若干個(gè)異常,并在該方法的方法體中具體給出產(chǎn)生異常的操作,即用相應(yīng)的異常類創(chuàng)建對(duì)象,這將導(dǎo)致該方法結(jié)束執(zhí)行并拋出所創(chuàng)建的異常對(duì) 象。程序必須在trycatch塊語(yǔ)句中調(diào)用拋出異常的方法。 5.14 5.14 異常類異常類 在下面例子中,用一個(gè)方法求偶正數(shù)的平方根,因此我們自己定義了兩個(gè)異
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 反擔(dān)保質(zhì)押合同書(shū)
- 企業(yè)辦公環(huán)境智能調(diào)節(jié)系統(tǒng)解決方案
- 合同汽車融資租賃合同
- 產(chǎn)品銷售代理協(xié)議內(nèi)容要求條款書(shū)
- 虹口區(qū)淺基坑圍護(hù)施工方案
- 廠房股份轉(zhuǎn)讓協(xié)議書(shū)
- 環(huán)保行業(yè)政策解讀與操作規(guī)范
- 2025年重慶社區(qū)面試試題及答案
- 辦公室隔斷石膏板施工方案
- 炭疽病防治知識(shí)培訓(xùn)
- 高血壓中醫(yī)健康教育
- 新疆油田分布圖
- 2024年上饒職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案1套
- 低氧血癥的護(hù)理
- 莫塔全科醫(yī)學(xué)安全診斷策略
- 第1課 古代亞非(教學(xué)課件)-【中職專用】《世界歷史》同步課堂(同課異構(gòu))(高教版2023?基礎(chǔ)模塊)
- 【萬(wàn)科集團(tuán)公司編制合并財(cái)務(wù)報(bào)表存在的問(wèn)題及優(yōu)化建議探析10000字(論文)】
- 第一單元《歡天喜地》第一課 《多彩的節(jié)日》(教案)三年級(jí)下冊(cè)《人文與社會(huì)》黑龍江地方課程
- 第二單元大單元教學(xué)設(shè)計(jì) 2023-2024學(xué)年統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- (高清版)DZT 0291-2015 飾面石材礦產(chǎn)地質(zhì)勘查規(guī)范
- 固定資產(chǎn)投資項(xiàng)目節(jié)能登記表
評(píng)論
0/150
提交評(píng)論