匿名內部類精講

匿名內部類適合創建那種只需要一次使用的類,例如命令模式時所需要的Command對象。匿名內部類的語法有點奇怪,創建匿名內部類時會立即創建一個該類的實例,這個類定義立即消失,匿名內部類不能重複使用。
    定義匿名內部類的格式如下:

 

從上面定義可以看出,匿名內部類必須繼承一個父類,或實現一個接口,但最多隻能繼承一個父類,或實現一個接口。
 關於匿名內部類還有如下兩條規則:
 1)匿名內部類不能是抽象類,因爲系統在創建匿名內部類的時候,會立即創建內部類的對象。因此不允許將匿名內部類
 定義成抽象類。
 2)匿名內部類不等定義構造器,因爲匿名內部類沒有類名,所以無法定義構造器,但匿名內部類可以定義實例初始化塊,
 通過實例初始化塊來完成構造器需要完成的事情。
 最常用的創建匿名內部類的方式是需要創建某個接口類型的對象,如下程序所示: 

上面程序中的TestAnonymous類定義了一個test方法,該方法需要一個Product對象作爲參數,但Product只是一個接口,
無法直接創建對象,因此此處考慮創建一個Product接口實現類的對象傳入該方法---如果這個Product接口實現類需要重複
使用,則應該經該實現類定義一個獨立類;如果這個Product接口實現類只需一次使用,則可採用上面程序中的方式,定義
一個匿名內部類。
    正如上面程序中看到,定義匿名類不需要class關鍵字,而是在定義匿名內部類時直接生成該匿名內部類的對象。上面
粗體字代碼部分就是匿名類的類體部分。
 由於匿名內部類不能是抽象類,所以匿名內部類必須實現它的抽象父類或者接口裏包含的所有抽象方法。
 對於上面創建Product實現類對象的代碼,可以拆分成如下代碼:

 

 當通過實現接口來創建匿名內部類時,匿名內部類也不能顯示創建構造器,因此匿名內部類只有一個隱式的無參數構造
器,故new接口名後的括號裏不能傳入參數值。
    但如果通過繼承父類來創建匿名內部類是,匿名內部類將擁有和父類相似的構造器,此處的相似指的是擁有相同的形參
列表。

 

 

 

 

上面程序創建了一個抽象父類Device,這個抽象父類裏包含兩個構造器:一個無參數的,一個有參數的。當創建以Device
爲父類的匿名內部類時,即可以傳入參數(如上面程序中第一段粗體字部分),也可以不傳入參數(如上面程序中第二段粗體
字部分)。
 當創建匿名內部類時,必須實現接口或抽象父類裏的所有抽象方法。如果有需要,也可以重寫父類中的普通方法,如上面
程序的第二段粗體字代碼部分,匿名內部類重寫了抽象父類Device類的getName方法,其中getName方法並不是抽象方法。
    如果匿名內部類需要訪問外部類的局部變量,則必須使用final修飾符來修飾外部類的局部變量,
否則系統將報錯。

 

 上面程序中粗體子代碼是匿名內部類訪問了外部類的局部變量,由於age變量沒有使用final修飾符修飾,所以粗體字代碼將
引起編譯異常。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章