簡(jiǎn)單談?wù)刯ava中匿名內(nèi)部類構(gòu)造函數(shù)
先看看下面的代碼能不能編譯通過(guò):
public static void main(String[] args) { List l1 = new ArrayList(); List l2 = new ArrayList(){}; List l3 = new ArrayList(){{}}; System.out.println(l1.getClass() == l2.getClass() ); System.out.println(l2.getClass() == l3.getClass() ); System.out.println(l1.getClass() == l3.getClass() ); }
答案是能通過(guò)編譯,輸出3個(gè)false。l1很容易理解,就是聲明了一個(gè)
ArrayList對(duì)象,那么l2、l3是什么呢?
l2是一個(gè)匿名類內(nèi)部類對(duì)象,繼承ArrayList;
l3語(yǔ)句有些古怪,帶了兩個(gè)大括號(hào),其實(shí)我們這樣寫就會(huì)明白了,這也是一個(gè)匿名內(nèi)部類的定義,它的代碼類似如下:
class Sub extends ArrayList { { //初始化代碼塊 } } List l3 = new Sub();
看到了吧,就是多了一個(gè)初始化代碼塊而已,起到構(gòu)造函數(shù)的功能。當(dāng)然一個(gè)類中的構(gòu)造代碼塊可以有多個(gè),下面的代碼是可以編譯的:
List l4 = new ArrayList(){{}{}{}};
匿名內(nèi)部類雖然可以用一個(gè)初始化代碼塊來(lái)充當(dāng)構(gòu)造函數(shù),但其構(gòu)造函數(shù)還是進(jìn)行了特殊的處理,它在初始化時(shí)直接調(diào)用父類的同參構(gòu)造函數(shù),然后在調(diào)用自己的代碼塊,例如:
List l5 = new ArrayList(5){ { System.out.println("我是匿名內(nèi)部類"); } };
等價(jià)于:
class Sub extends ArrayList{ { System.out.println("我是匿名內(nèi)部類"); } Sub(int num){ super(num); } } List l5 = new Sub(5);
我們來(lái)看段示例代碼
package testtest; public class Main { public static void main(String[] args) { InnerTest inner = new InnerTest(); Test t = inner.get(3); System.out.println(t.getI()); } } class Test { private int i; public Test(int i) { this.i = i; } public int getI() { return i; } } class InnerTest { public Test get(int x) { return new Test(x) { @Override public int getI() { return super.getI() * 10; } }; } }
編譯之后得到4個(gè)class文件:Test.class,InnerTest.class,InnerTest$1.class以及Main.class。容易看出來(lái),Main.class是測(cè)試類的class文件,Test.class是超類Test的class文件,InnerTest.class是InnerTest 的class文件,最值得關(guān)注的就是匿名內(nèi)部類的class文件InnerTest$1.class。
相關(guān)文章
MyBatis查詢數(shù)據(jù),賦值給List集合時(shí),數(shù)據(jù)缺少的問(wèn)題及解決
這篇文章主要介紹了MyBatis查詢數(shù)據(jù),賦值給List集合時(shí),數(shù)據(jù)缺少的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟
本文主要介紹了Eclipse開發(fā)JavaWeb項(xiàng)目配置Tomcat的方法步驟,首先介紹eclipse開發(fā)JavaWeb項(xiàng)目需要配置的相關(guān)環(huán)境,使用tomcat軟件在本地搭建服務(wù)器,然后再在eclipse環(huán)境下配置tomcat,感興趣的可以了解一下2021-08-08springboot-curd基于mybatis項(xiàng)目搭建
這篇文章主要介紹了springboot-curd基于mybatis項(xiàng)目搭建,圍繞相關(guān)資料展開詳細(xì)內(nèi)容,希望對(duì)正在學(xué)習(xí)的你有所幫助,需要的小伙伴也可以參考一下2022-01-01SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Java運(yùn)行時(shí)數(shù)據(jù)區(qū)域(內(nèi)存劃分)的深入講解
聽(tīng)說(shuō)Java運(yùn)行時(shí)環(huán)境的內(nèi)存劃分是挺進(jìn)BAT的必經(jīng)之路,這篇文章主要給大家介紹了關(guān)于Java運(yùn)行時(shí)數(shù)據(jù)區(qū)域(內(nèi)存劃分)的相關(guān)資料,需要的朋友可以參考下2021-06-06詳解springboot+atomikos+druid?數(shù)據(jù)庫(kù)連接失效分析
本文主要介紹了springboot+atomikos+druid?數(shù)據(jù)庫(kù)連接失效分析,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02淺談SpringBoot 中關(guān)于自定義異常處理的套路
這篇文章主要介紹了淺談SpringBoot 中關(guān)于自定義異常處理的套路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04