深入理解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
1. 匿名內(nèi)部類:隱形的繼承
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
new 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
總而言之,這段代碼利用匿名內(nèi)部類和實(shí)例初始化塊,在創(chuàng)建ArrayList對象的同時(shí)完成初始化,使得代碼更加緊湊,并提升了可讀性。 這種技巧在需要快速創(chuàng)建并初始化對象時(shí)非常實(shí)用。