什么是Java語法中的匿名內(nèi)部類與代碼塊的使用方法?

什么是Java語法中的匿名內(nèi)部類與代碼塊的使用方法?

深入理解Java匿名內(nèi)部類和代碼塊的巧妙結(jié)合

Java編程中,匿名內(nèi)部類和代碼塊的組合運(yùn)用,常常使代碼簡潔高效,但初學(xué)者可能難以理解其精髓。本文將詳細(xì)剖析一段示例代碼,揭示其背后的機(jī)制。

讓我們先來看這段代碼:

public static void main(String[] args) {     List<String> list = new ArrayList<String>() {{                add("A");             add("B");             add("C");     }};     System.out.println(list); }

乍一看,new ArrayList() {{ … }} 似乎有些奇特。這正是匿名內(nèi)部類和實(shí)例初始化塊的巧妙結(jié)合。

1. 匿名內(nèi)部類:隱形的繼承

立即學(xué)習(xí)Java免費(fèi)學(xué)習(xí)筆記(深入)”;

new ArrayList() 創(chuàng)建了一個(gè)ArrayList對象的匿名子類實(shí)例。這意味著系統(tǒng)在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建了一個(gè)新的類,它繼承自ArrayList,但沒有顯式地定義類名。

2. 實(shí)例初始化塊:對象的即時(shí)初始化

緊隨其后的{{ … }} 是一個(gè)實(shí)例初始化塊。它與構(gòu)造器不同,實(shí)例初始化塊在創(chuàng)建對象時(shí),在其構(gòu)造器之前執(zhí)行。在這里,它用于直接向新創(chuàng)建的ArrayList對象中添加元素 “A”、”B” 和 “C”。

因此,這段代碼等效于:

public static void main(String[] args) {     List<String> list = new MyArrayList(); // MyArrayList 是一個(gè)繼承自 ArrayList 的匿名類     System.out.println(list); }  class MyArrayList extends ArrayList<String> {     { // 實(shí)例初始化塊         add("A");         add("B");         add("C");     } }

MyArrayList 這個(gè)類是隱式創(chuàng)建的,我們無需顯式定義它。實(shí)例初始化塊負(fù)責(zé)在對象創(chuàng)建的同時(shí)完成初始化工作。

Java版本差異:鉆石運(yùn)算符的應(yīng)用

需要注意的是,在Java 7及之前版本,這段代碼需要寫成 new ArrayList() {{ … }},而Java 8及以后版本,由于引入了鉆石運(yùn)算符(),可以簡寫為 new ArrayList() {{ … }}。

總而言之,這段代碼利用匿名內(nèi)部類和實(shí)例初始化塊,在創(chuàng)建ArrayList對象的同時(shí)完成初始化,使得代碼更加緊湊,并提升了可讀性。 這種技巧在需要快速創(chuàng)建并初始化對象時(shí)非常實(shí)用。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享