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