匿名內部類別適合建立那種只需要一次使用的類,例如命令模式時所需要的Command物件。匿名內部類別的語法有點奇怪,在創建匿名內部類別時會立即創建一個該類別的實例,這個類別定義立即消失,匿名內部類別不能重複使用。
定義匿名內部類別的格式如下:
new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 }
從上面定義可以看出,匿名內部類別必須繼承一個父類,或實作一個接口,但最多只能繼承一個父類,或實作一個介面。
關於匿名內部類別還有以下兩條規則:
1)匿名內部類別不能是抽象類別,因為系統在建立匿名內部類別的時候,會立即建立內部類別的物件。因此不允許將匿名內部類別
定義成抽象類別。
2)匿名內部類別不等定義建構器,因為匿名內部類別沒有類別名,所以無法定義建構器,但匿名內部類別可以定義實例初始化區塊,
透過實例初始化區塊來完成建構器需要完成的事情。
最常用的建立匿名內部類別的方式是需要建立某個介面類型的對象,如下程式所示:
interface Product{ public double getPrice(); public String getName(); } public class TestAnonymous{ public void test(Product p){ System.out.println("购买了一个"+p.getName()+",花掉 了"+p.getPrice()); } public static void main(String[]args){ TestAnonymous ta = new TestAnonymous(); ta.test(new Product(){ public double getPrice(){ return 567; } public String getName(){ return "AGP显卡"; } }); } }
上面程式中的TestAnonymous類別定義了一個test方法,該方法需要一個Product物件作為參數,但Product只是一個接口,
無法直接創建對象,因此此處考慮創建一個Product接口實現類的對象傳入該方法---如果這個Product接口實現類需要重複
使用,則應該經該實現類定義一個獨立類別;如果這個Product介面實作類別只需一次使用,則可採用上面程式中的方式,定義
一個匿名內部類別。
如同上述程式中看到,定義匿名類別不需要class關鍵字,而是在定義匿名內部類別時直接產生該匿名內部類別的物件。上面
粗體字碼部分就是匿名類別的類體部分。
由於匿名內部類別不能是抽象類別,所以匿名內部類別必須實作它的抽象父類別或介面裡包含的所有抽象方法。
對於上面建立Product實作類別物件的程式碼,可以拆分成以下程式碼:
class AnonymousProduct implements Product{ public double getPrice(){ return 567; } public String getName(){ return "AGP显卡"; } } ta.test(new AnonymousProduct());
當透過實作介面來建立匿名內部類別時,匿名內部類別也不能顯示建立建構器,因此匿名內部類別只有一個隱式的無參數建構
器,故new介面名後的括號裡不能傳入參數值。
但如果透過繼承父類別來建立匿名內部類別是,匿名內部類別將擁有和父類別相似的建構器,此處的相似指的是擁有相同的形參
列表。
abstract class Device{ private String name; public Device(){ } public Device(String name){ this.name = name; } public abstract double getPrice(); //此处省略了name属性的setter和getter方法 } public class AnonymousInner{ public void test(Device d){ System.out.println("购买了一个"+d.getName()+",花掉了"+d.getPrice()); } public static void main(String[] args){ AnonymousInner ai = new AnonymousInner(); //调用有参数的构造器创建Device匿名实现类的对象 ai.test(new Device("电子示波器"){ public double getPrice(){ return 67; } }); //调用无参数的构造器创建Device匿名实现类的对象 Device d = new Device(){ //初始化块 { System.out.println("匿名内部类的初始化块..."); } //实现抽象方法 public double getPrice(){ return 56; } public Sting getName(){ return "键盘"; } }; ai.test(d); } }
上面程式建立了一個抽象父類別Device,這個抽象父類別裡包含兩個建構器:一個無參數的,一個有參數的。當建立以Device
為父類別的匿名內部類別時,即可以傳入參數(如上方程式中第一段粗體字部分),也可以不傳入參數(如上方程式中第二段粗體
字部分)。
當建立匿名內部類別時,必須實作介面或抽象父類別裡的所有抽象方法。如果有需要,也可以重寫父類別中的普通方法,如上面
程式的第二段粗體字程式碼部分,匿名內部類別重寫了抽象父類別Device類別的getName方法,其中getName方法並不是抽象方法。
如果匿名內部類別需要存取外部類別的局部變量,則必須使用final修飾符來修飾外部類別的局部變量,
否則系統將會錯誤。
interface A{ void test(); } public class TestA{ public static void main(Strign[] args){ int age = 0; A a = new A(){ public void test(){ //下面语句将提示错误:匿名内部类内访问局部变量必须使用final修饰 System.out.println(age); } }; } }
上面程式中粗體子程式碼是匿名內部類別存取了外部類別的局部變量,由於age變數沒有使用final修飾符修飾,所以粗體字程式碼將
引起編譯異常。
更多匿名內部類精講相關文章請關注PHP中文網!

匿名内部类可导致内存泄漏,问题在于它们持有外部类的引用,从而阻止外部类被垃圾回收。解决方法包括:1.使用弱引用,当外部类不再被强引用持有时,垃圾回收器会立即回收弱引用对象;2.使用软引用,垃圾回收器会在进行垃圾回收时需要内存时才回收软引用对象。在实战中,例如Android应用中,可以通过使用弱引用来解决因匿名内部类引起的内存泄漏问题,从而在不需要监听器时回收匿名内部类。

匿名内部类是Java中没有显式名称、通过new表达式创建的特殊内部类,主要用于实现特定接口或扩展抽象类,并在创建后立即使用。常见的匿名内部类设计模式包括:适配器模式:将一个接口转换为另一个接口。策略模式:定义和替换算法。观察者模式:注册观察者并处理事件。它在实际应用中非常有用,例如按字符串长度排序TreeSet、创建匿名线程等。

匿名内部类在Java中作为方便创建子类、简化代码和处理事件(例如按钮单击)的特殊内部类。实战案例包括:事件处理:使用匿名内部类为按钮添加单击事件监听器。数据转换:使用Collections.sort方法和匿名内部类作为比较器对集合进行排序。

匿名内部类的生命周期由其作用域决定:方法局部内部类:仅在创建它的方法范围内有效。构造器内部类:与外部类实例绑定,当外部类实例释放时释放。静态内部类:与外部类同时加载卸载。

匿名内部类的性能问题在于每次使用都会重新创建,可通过以下策略优化:1.将匿名内部类存储在局部变量中;2.使用非静态内部类;3.使用lambda表达式。实战测试表明lambda表达式优化效果最佳。

Lambda表达式作为匿名内部类的替代方案,提供了更简洁的方式来定义函数式接口的实现:使用简短语法(parameters)->expression定义匿名函数。适用于需要实现函数式接口(只有一个抽象方法)的场合。能够简化列表排序和线程定义等任务。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器