匿名內部類別適合建立那種只需要一次使用的類,例如命令模式時所需要的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中文網!

JavadevelovermentIrelyPlatForm-DeTueTososeVeralFactors.1)JVMVariationsAffectPerformanceNandBehaviorAcroSsdifferentos.2)Nativelibrariesviajnijniiniininiinniinindrododerplatefform.3)

Java代碼在不同平台上運行時會有性能差異。 1)JVM的實現和優化策略不同,如OracleJDK和OpenJDK。 2)操作系統的特性,如內存管理和線程調度,也會影響性能。 3)可以通過選擇合適的JVM、調整JVM參數和代碼優化來提升性能。

Java'splatFormentenceHaslimitations不包括PerformanceOverhead,versionCompatibilityIsissues,挑戰WithnativelibraryIntegration,Platform-SpecificFeatures,andjvminstallation/jvminstallation/jvmintenance/jeartenance.therefactorscomplicatorscomplicatethe“ writeOnce”

PlatformIndependendecealLowsProgramStormonanyPlograwsStormanyPlatFormWithOutModification,而LileCross-PlatFormDevelopmentRequiredquiresMomePlatform-specificAdjustments.platFormIndependence,EneblesuniveByjava,EnablesuniversUniversAleversalexecutionbutmayCotutionButMayComproMisePerformance.cross.cross.cross-platformd

JITcompilationinJavaenhancesperformancewhilemaintainingplatformindependence.1)Itdynamicallytranslatesbytecodeintonativemachinecodeatruntime,optimizingfrequentlyusedcode.2)TheJVMremainsplatform-independent,allowingthesameJavaapplicationtorunondifferen

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

Dreamweaver Mac版
視覺化網頁開發工具