摘要:針對(duì)一些Java學(xué)習(xí)者對(duì)匿名類經(jīng)常產(chǎn)生模糊認(rèn)識(shí),通過三個(gè)具體的實(shí)例詳細(xì)地分析了Java匿名類的內(nèi)在本質(zhì)。分析結(jié)果表明,匿名類實(shí)際上可以看作是一個(gè)類的子類或者是一個(gè)接口的實(shí)現(xiàn)類,這樣可使匿名類更易于理解。
關(guān)鍵詞:Java;匿名類;子類;接口
中圖分類號(hào):N43
文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1006-8228(2011)08-42-02
引言
什么是匿名類,很多教材和參考書把它解釋為:匿名類是一個(gè)內(nèi)部類,是一個(gè)沒有類名的類。匿名類的優(yōu)點(diǎn)是它可以使代碼結(jié)合的更加緊湊,使代碼更加易于理解。
其實(shí),上述解釋并沒有說明匿名類的實(shí)質(zhì),這是對(duì)匿名類的一種很膚淺的認(rèn)識(shí)和理解。因此,很多JAVA的學(xué)習(xí)者尤其是初學(xué)者在接觸到匿名類時(shí)常常是一頭霧水,不知道匿名類到底是一個(gè)什么東西,以及在實(shí)際編程中如何去運(yùn)用匿名類。學(xué)習(xí)過Java的人都知道,在Java GUI程序設(shè)計(jì)中會(huì)大量地運(yùn)用到匿名類。很多學(xué)習(xí)者在編寫這類程序時(shí)常常是模仿一些現(xiàn)成的實(shí)例,但并沒有搞清楚為什么這樣用;有很多程序由于大量運(yùn)用匿名類,使得代碼變得難以理解,這其中一個(gè)很根本的原因就是沒有搞清楚匿名類的實(shí)質(zhì)。
本文的理解是:匿名類是一個(gè)內(nèi)部類,匿名類實(shí)質(zhì)也是一個(gè)類(普通類或抽象類)的子類或者是—個(gè)接口的實(shí)現(xiàn)類。
下面就通過三個(gè)具體的實(shí)例來分析匿名類的實(shí)質(zhì)。
1、匿名類與普通類子類的分析和比較
表1中的代碼定義了兩個(gè)內(nèi)部類:TestClass和Son,其中Son TestClass的子類,它覆蓋了TestClass中的cry方法。另外,在test方法中創(chuàng)建了兩個(gè)實(shí)例,一個(gè)是Son的一個(gè)實(shí)例aa,另一個(gè)是TestClass的一個(gè)匿名類的一個(gè)實(shí)例bb,該匿名類的方法與Son中的方法相同,最后用這兩個(gè)不同的實(shí)例分別調(diào)用相應(yīng)的cry方法。其運(yùn)行結(jié)果都為“this general class'son iscrying”。這個(gè)實(shí)例說明:定義一個(gè)匿名類與定義一個(gè)一般類的一個(gè)子類,其內(nèi)在含義和調(diào)用方法方式完全相同。
2、匿名類與抽象類子類的分析和比較
表2中的代碼定義了兩個(gè)內(nèi)部類TestAbstract和Son,其中Son是TestClass的子類,TestAbstract是一個(gè)抽象類,Son覆蓋了TestAbstract中的cry抽象方法。另外,在test方法中創(chuàng)建了兩個(gè)實(shí)例,一個(gè)是Son的一個(gè)實(shí)例aa,另一個(gè)是TestAbstract的一個(gè)匿名類的一個(gè)實(shí)例bb,該匿名類的方法與Son中的方法相同,最后用這個(gè)不同的實(shí)例分別調(diào)用相應(yīng)的cry方法。其運(yùn)行結(jié)果都為“this general abstract class'son is crying”。這個(gè)實(shí)例說明:定義一個(gè)抽象匿名類與定義一個(gè)抽象類的子類(當(dāng)然,這個(gè)子類不能再是一個(gè)抽象類)其內(nèi)在含義和調(diào)用方法方式完全相同。
3、匿名類與接口實(shí)現(xiàn)類的分析和EE較
表3中的代碼定義了—個(gè)內(nèi)部接口TestInterface和實(shí)現(xiàn)這個(gè)內(nèi)部接口的一個(gè)內(nèi)部類Son,Son實(shí)現(xiàn)了接口Tesffnterfaee中的兩抽象方法cry和sleep。另外,在test方法中創(chuàng)建了兩個(gè)實(shí)例,一個(gè)是Son的一個(gè)實(shí)例aa,另一個(gè)是TestInterface的一個(gè)匿名類的一個(gè)實(shí)例bb,該匿名類的方法與Son中的方法相同,最后用這個(gè)不同的實(shí)例分別調(diào)用相應(yīng)的cry方法。其運(yùn)行結(jié)果都為“this interface'son is crying”。這個(gè)實(shí)例說明:定義一個(gè)接口匿名類與定義一個(gè)接口的實(shí)現(xiàn)類(當(dāng)然這個(gè)實(shí)現(xiàn)類不能是一個(gè)抽象類)其內(nèi)在含義和調(diào)用方法方式完全相同。
4、結(jié)束語(yǔ)
匿名類可以理解為一個(gè)類(普通類或抽象類)的子類或者是一個(gè)接口的一個(gè)實(shí)現(xiàn)類。當(dāng)這個(gè)匿名類是一個(gè)普通類的子類時(shí),這個(gè)類中的方法必須要覆蓋類中的某些方法,否則沒有任何意義;當(dāng)這個(gè)匿名類是一個(gè)抽象類的子類時(shí),這個(gè)類中的方法必須要實(shí)現(xiàn)類中所有的抽象方法,當(dāng)然也可以覆蓋某些方法;當(dāng)這個(gè)匿名類是一個(gè)接口的一個(gè)實(shí)現(xiàn)類時(shí),這個(gè)類中的方法必須要實(shí)現(xiàn)這個(gè)接口中所有的抽象方法。總之,匿名類的定義原則和調(diào)用方式與類的子類以及接口實(shí)現(xiàn)類(這些子類或?qū)崿F(xiàn)類不能是抽象類)的定義原則和調(diào)用方式完全相同。所不同的主要有兩點(diǎn):其一,若匿名類中定義的方法在父類或接口中沒有定義或聲明時(shí),則這個(gè)方法無法調(diào)用,也就是說這個(gè)方法沒有任何意義,但是在子類或?qū)崿F(xiàn)類中卻不存在這種情況;其二,匿名類的實(shí)例化是通過其父類或所實(shí)現(xiàn)的接口(如new<父類名或接口名>()來實(shí)現(xiàn)來,匿名類沒有類名,所以也沒有構(gòu)造方法。
參考文獻(xiàn):
[1]李芝興等.Java序設(shè)計(jì)之網(wǎng)絡(luò)編程.清華大學(xué)出版社,2009.
[2]王森.Java深度歷險(xiǎn),華中科技大學(xué)出版社,2002.
[3]王克宏.Java技術(shù)教程(基礎(chǔ)篇),清華大學(xué)出版社,2002.
[4]孫燕.Java2入門與實(shí)例教程,中國(guó)鐵造出版社,2003.
[5]柯溫釗.Java例解教程,中國(guó)鐵道出版社,2001.