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