Java中的匿名內部類及其使用技巧

2021-08-28 03:18:20 字數 1824 閱讀 2210

在介紹匿名內部類之前,首先我們應該先來了解一下內部類及區域性內部類: 

內部類

內部類(inner class)是定義在另乙個類中的類,內部類中的方法可以訪問建立該內部類的類(我們稱其為外圍類 outer class)的域中所有資料(包括私有/private資料)。並且,內部類可以對同乙個包中的其他類隱藏起來。

但是由於內部類是一種編譯器現象,在虛擬機器中只存在常規類檔案,所以在編譯過程中,內部類被翻譯成」外圍類名$內部類名」的乙個常規類,另一方面由於內部類有非常高的特權(可以訪問外圍類中的私有域)所以在一些特殊手段下(比如利用十六進製制編輯器建立乙個虛擬機器指令呼叫該內部類),有可能會導致外圍類內的私有域資料洩露。

區域性內部類

當某乙個類只被唯一乙個方法呼叫時,就可以採用區域性內部類來定義它(該類定義在某方法內部)。區域性類不能使用public或者private訪問說明符進行宣告,它的作用域被限定在宣告這個區域性類的方法(或**塊)中。並且,區域性類對外部世界是完全隱藏起來的,及時定義它的方法所在的外圍類也不可以訪問它。

由於區域性內部類對於外圍類不可見,所以不存在通過其他手段呼叫該區域性內部類的危險,也就極大的保證了安全性。

匿名內部類定義

假如乙個區域性內部類只被用一次(只用它構建乙個物件),就可以不用對其命名了,這種沒有名字的類被稱為匿名內部類(anonymous inner class),其**格式通常為:

new supertype(construction parameters);
其中supertype可以是乙個介面(匿名內部類將要實現的介面),也可以是乙個類(匿名內部類將要擴充套件它)。匿名內部類的可見域與區域性內部類相同。

匿名內部類的構造器

由於構造器的名字必須與類名相同,而匿名內部類沒有類名,所以匿名類不能含有構造器。取而代之的是將構造器引數傳遞給超類(superclass)的構造器。

當匿名類實現某個介面的時候,一定不能存在任何構造引數。這時,**格式構成變成如下所示:

new inte***cetype();
匿名內部類的注意事項

建立乙個與超類類似,但不完全相同的匿名子類非常容易,但這樣的子類物件在使用equals方法時要特別當心,我們在定義equals時,一般要對型別進行測試:

if(getclass() != other.getclass()) return false;
這個測試條件在用於匿名子類時會失效!

匿名內部類的使用技巧

這裡著重介紹一下雙括號初始化(double brace initialization)技巧

假設我們想構造乙個陣列列表,並將它傳給某個方法:

arraylistfriends = new arraylist<>();

friends.add("harry");

friends.add("tony");

invite(friends);

若這個friends陣列之後不會再使用的話,我們可以把它構造成乙個匿名列表:

invite(new arraylist()});
這裡的兩層括號,外層括號建立了乙個 arraylist的匿名子類。內層括號定義了乙個該匿名子類的構造塊(構造物件時會自動執行的**塊)。

由於匿名內部類的訪問特性與區域性內部類相同,所以僅僅做了這乙個小小的改動不僅保護了資料(如果不是這樣做的話,可以用一些特殊方法,得到宣告的friends列表)還精簡了**,何樂而不為呢。

java中匿名內部類的使用

之前總結內部類的使用時講過匿名內部類的使用,但講得不夠詳細,這次再總結一下,方便以後複習 一.匿名內部類的建立 new 父類構造器 引數列表 實現介面 當然,這裡還可以建立乙個父類的引用指向匿名內部類物件 父類名 介面名 引用變數 new 父類構造器 引數列表 實現介面 但是一般沒必要這麼做,第一種...

Java內部類與匿名內部類的使用

內部類 在類中定義類就稱作內部類 內部類可以直接訪問外部類的成員,包括私有 外部類要訪問內部類的成員,必須建立物件 外部類名字.內部類名 物件名 外部類物件.內部類物件 匿名內部類 實際上就是內部類的簡化寫法,前提是存在乙個類或者介面,這裡的類可以是具體類也可以是抽象類 new 類名或者介面名 其本...

java 中的匿名內部類

一 基本概況 匿名內部類 就是內部類的簡化寫法 前提 存在乙個介面或者是乙個類 這裡的類可以是抽象的也可以是具體的類 格式 new 類名或者介面名 匿名內部類的本質 是乙個匿名物件或者是實現了該介面的的子類的匿名物件,inte ce inter class outer public void sho...