更新時間:2022-12-21 12:29:23 來源:動力節(jié)點 瀏覽1755次
匿名類是沒有名稱的本地類。使用new運算符在一個簡潔的表達式中定義和實例化匿名類。本地類定義是 Java 代碼塊中的一條語句,而匿名類定義是一個表達式,這意味著它可以作為更大表達式(例如方法調(diào)用)的一部分包含在內(nèi)。當一個本地類只被使用一次時,考慮使用匿名類語法,它將類的定義和使用放在完全相同的地方。
公共 java.util.Enumeration 枚舉(){
// 匿名類被定義為返回語句的一部分
返回新的 java.util.Enumeration() {
可連接電流;= 頭;
{ 當前 = 頭; } // 用實例初始化器替換構(gòu)造函數(shù)
public boolean hasMoreElements() { return (current != null); }
公共對象 nextElement() {
if (current == null) throw new java.util.NoSuchElementException();
對象值=當前;
current = current.getNext();
返回值;
}
}; // 注意所需的分號:它終止返回語句
}
匿名類的一個常見用途是提供適配器類的簡單實現(xiàn)。適配器類是定義由其他某個對象調(diào)用的代碼的類。以java.io.File類的list()方法 為例。此方法列出目錄中的文件。不過,在返回列表之前,它會將每個文件的名稱傳遞給您必須提供的FilenameFilter對象。此FilenameFilter對象接受或拒絕每個文件。當您實現(xiàn) FilenameFilter接口時,您正在定義一個適配器類以與File.list()一起使用方法。由于此類的主體通常很短,因此很容易將適配器類定義為匿名類。以下是如何定義FilenameFilter類以僅列出名稱以.java 結(jié)尾的那些文件:
文件 f = 新文件("/src"); // 要列出的目錄
// 現(xiàn)在用一個 FilenameFilter 參數(shù)調(diào)用 list() 方法
// 定義并實例化 FilenameFilter 的匿名實現(xiàn)
// 作為方法調(diào)用表達式的一部分。
String[] filelist = f.list(new FilenameFilter() {
public boolean accept(File f, String s) { return s.endsWith(".java"); }
}); // 不要忘記結(jié)束方法調(diào)用的括號和分號!
如您所見,定義匿名類和創(chuàng)建該類實例的語法使用new關(guān)鍵字,后跟類名和花括號中的類主體定義。如果new關(guān)鍵字后面的名稱是類的名稱,則匿名類是命名類的子類。如果new后面的名稱指定了一個接口,如前兩個示例所示,匿名類將實現(xiàn)該接口并擴展Object。該語法不包括任何指定 擴展子句、 實現(xiàn)子句或類名稱的方法。
因為匿名類沒有名稱,所以不可能在類主體中為它定義構(gòu)造函數(shù)。這是對匿名類的基本限制之一。您在匿名類定義中超類名稱后的括號中指定的任何參數(shù)都隱式傳遞給超類構(gòu)造函數(shù)。匿名類通常用于子類化不帶任何構(gòu)造函數(shù)參數(shù)的簡單類,因此匿名類定義語法中的括號通常為空。在前面的示例中,每個匿名類都實現(xiàn)了一個接口并擴展了Object。由于Object()構(gòu)造函數(shù)不帶參數(shù),因此這些示例中的括號為空。
關(guān)于匿名類的最優(yōu)雅的事情之一是它們允許您在需要的地方準確地定義一次性類。此外,匿名類的語法簡潔,可以減少代碼中的混亂。
因為匿名類只是本地類的一種,所以匿名類和本地類具有相同的限制。匿名類不能定義任何靜態(tài)字段、方法或類,靜態(tài)最終 常量除外。接口不能匿名定義,因為沒有名字就無法實現(xiàn)接口。此外,與本地類一樣,匿名類不能是 public、private、 protected或static。
由于匿名類沒有名稱,因此不可能為匿名類定義構(gòu)造函數(shù)。如果您的類需要構(gòu)造函數(shù),則必須改用本地類。但是,您通常可以使用實例初始值設(shè)定項來替代構(gòu)造函數(shù)。事實上,正是出于這個目的,將實例初始化程序引入了該語言。
定義匿名類的語法結(jié)合了定義和實例化。因此,如果每次執(zhí)行包含塊時都需要創(chuàng)建該類的多個實例,則使用匿名類而不是本地類是不合適的。