什么是內(nèi)部類?
內(nèi)部類,顧名思義,就是在一個類內(nèi)部創(chuàng)建的類。
那么,內(nèi)部類有哪些使用場景?
使用內(nèi)部類時有哪些坑?
內(nèi)部類的坑
在內(nèi)部類中的方法內(nèi)部,調(diào)用外圍類類名.this方法會返回當(dāng)前內(nèi)部類所連接的外圍類對象的引用,如下圖:
這有個很合理的解釋:內(nèi)部類如果使用了外部環(huán)境的狀態(tài),那么,內(nèi)部類加上創(chuàng)建它的外部環(huán)境,就叫做閉包。
什么時候會用到內(nèi)部類?
隱藏某些實現(xiàn)、多繼承、單元測試、閉包問題(即如果一個類繼承了某個父類,這個類還想實現(xiàn)一個接口,但是父類和這接口有些方法或?qū)傩杂袥_突,想把父類和接口的功能都保留下來,那么,就可以用內(nèi)部類來配合,用接口加內(nèi)部類來實現(xiàn)閉包)
繼承內(nèi)部類時有哪些坑?
繼承自內(nèi)部類時,使用默認(rèn)的構(gòu)造器會報錯,因為內(nèi)部類會默認(rèn)的獲得指向其外部類對象的引用,所以繼承內(nèi)部類時應(yīng)該在構(gòu)造器參數(shù)中傳遞一個其外部類對象的引用(編譯器要求你一定要這樣做),然后在構(gòu)造器中使用該外部類對象引用的super方法(該super方法調(diào)用的是這個外部類對象的內(nèi)部類的構(gòu)造方法)。如果父類和接口都有一個方法,他們的方法簽名相同,那么子類中的這個方法,既是父類方法的重寫又是接口方法的實現(xiàn)。如下面2個圖,
內(nèi)部類的構(gòu)造器和其他方法都會默認(rèn)傳遞一個外圍類對象做參數(shù),如:
去掉這個內(nèi)部類的無參構(gòu)造器時,則用反射獲取不到其構(gòu)造器(即,不顯式的定義內(nèi)部類構(gòu)造器,使用反射就獲取不到內(nèi)部類的構(gòu)造器【有參無參均獲取不到】),顯式的定義一個無參構(gòu)造器,則可以獲取到使用了外部類對象當(dāng)做其默認(rèn)參數(shù)的內(nèi)部類構(gòu)造器。
以上就是長沙達內(nèi)教育java培訓(xùn)機構(gòu)的小編針對“Java內(nèi)部類的使用場景,使用時有哪些坑?”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。