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