匿名内部类探究——它是一个实例
目錄
- 我的學(xué)習(xí)過(guò)程
- 匿名內(nèi)部類(lèi)概述
- 匿名內(nèi)部類(lèi)探究
- 代碼驗(yàn)證(匿名內(nèi)部類(lèi)是一個(gè)實(shí)例)
- 結(jié)論
我的學(xué)習(xí)過(guò)程
昨天想學(xué)習(xí)一下Java8新特性,看到Lambda表達(dá)式可以替代匿名內(nèi)部類(lèi)。我對(duì)匿名內(nèi)部類(lèi)不太理解,決定學(xué)習(xí)一下。并進(jìn)行了下面的歸納和思考。
匿名內(nèi)部類(lèi)概述
繼承式匿名內(nèi)部類(lèi)聲明格式:
new 類(lèi)名(){};接口式匿名內(nèi)部類(lèi)聲明格式:
new 接口名(){ //接口中方法要重寫(xiě)(@Override可省略,不需要重寫(xiě)接口的全部方法) ... };匿名內(nèi)部類(lèi)有什么特點(diǎn)呢?
匿名內(nèi)部類(lèi)探究
匿名內(nèi)部類(lèi)是一個(gè)實(shí)例嗎?
答:繼承式匿名內(nèi)部類(lèi)是一個(gè)實(shí)例,接口式匿名內(nèi)部類(lèi)不是一個(gè)實(shí)例。有待考證*1
我的思考:
隱名內(nèi)部類(lèi)由于沒(méi)有類(lèi)名,就沒(méi)有自己的構(gòu)造器。
對(duì)于繼承式匿名內(nèi)部類(lèi)來(lái)說(shuō),匿名內(nèi)部類(lèi)是某個(gè)特定類(lèi)的子類(lèi),使用new時(shí)候,相當(dāng)于通過(guò)父類(lèi)構(gòu)造器實(shí)例化了一個(gè)實(shí)例。
對(duì)于接口式匿名內(nèi)部類(lèi)來(lái)說(shuō),匿名內(nèi)部類(lèi)是實(shí)現(xiàn)了某個(gè)特定的接口,使用new的時(shí)候,相當(dāng)于實(shí)現(xiàn)了特定接口,不是實(shí)例化。
有待考證*1
另外想法:接口式匿名內(nèi)部類(lèi)是一個(gè)類(lèi),使用new時(shí),就是相當(dāng)于實(shí)例化了一個(gè)對(duì)象,只是對(duì)象內(nèi)部實(shí)現(xiàn)了特定接口,所以是一個(gè)實(shí)例。傾向于認(rèn)為:接口式匿名內(nèi)部類(lèi)也是一個(gè)實(shí)例。
進(jìn)一步考證*1
接口式匿名內(nèi)部類(lèi)是一個(gè)實(shí)例。
代碼驗(yàn)證(匿名內(nèi)部類(lèi)是一個(gè)實(shí)例)
代碼文件包含(同一個(gè)包下):類(lèi):Car.java、接口:CarFun.java、main函數(shù)驗(yàn)證:Test.java
類(lèi):Car.java
上圖說(shuō)明:這是一個(gè)叫Car的類(lèi),它實(shí)現(xiàn)了CarFun接口,對(duì)接口中的drive()和stop()方法進(jìn)行了重寫(xiě)。
接口:CarFun.java
上圖說(shuō)明:這個(gè)是叫CarFun的接口,它有drive()和stop()兩個(gè)方法。
main函數(shù)驗(yàn)證:Test.java
==進(jìn)一步待考證*1:==匿名內(nèi)部類(lèi)可以傳參數(shù)嗎?我這里示例傳了參數(shù)height的值175,所以它還是匿名內(nèi)部類(lèi)嗎?
進(jìn)一步考證*1
去掉height參數(shù)。代碼如下:
通過(guò)第8行的zerocar.getHeight()語(yǔ)句打印,執(zhí)行結(jié)果得到
說(shuō)明:不傳參數(shù)時(shí)候,zerocar是一個(gè)實(shí)例對(duì)象,匿名內(nèi)部類(lèi)是一個(gè)實(shí)例。
思考:所以有參數(shù)情況下還是一個(gè)匿名內(nèi)部類(lèi)嗎?
暫時(shí)不知道。有待進(jìn)一步考證*2
這部分在main函數(shù)下寫(xiě)了繼承式匿名內(nèi)部類(lèi)。它是一個(gè)Car的子類(lèi),通過(guò)Car的有參構(gòu)造器實(shí)例化了一個(gè)實(shí)例zerocar。
//Car的有參構(gòu)造器 public Car(int height, int weight) {this.height = height;}且通過(guò)第7行的zerocar.getHeight()語(yǔ)句打印,執(zhí)行結(jié)果得到
Height: 175進(jìn)一步印證了zerocar是個(gè)實(shí)例對(duì)象。
(續(xù)上一張圖片)
這部分在main函數(shù)下寫(xiě)了接口式匿名內(nèi)部類(lèi)。我選擇把接口CarFun里的兩個(gè)方法都進(jìn)行了重寫(xiě)(不一定要全部方法重寫(xiě),因?yàn)榇颂幙梢允÷?#64;Override)。并用zerocarfun調(diào)用了drive()和stop()方法。執(zhí)行結(jié)果:
執(zhí)行成功,說(shuō)明zerocarfun可以調(diào)用方法,說(shuō)明它是一個(gè)對(duì)象。所以接口式匿名內(nèi)部類(lèi)也是一個(gè)實(shí)例。
同時(shí)驗(yàn)證了:
繼承式匿名內(nèi)部類(lèi)是通過(guò)父類(lèi)構(gòu)造器實(shí)例化,可以是有參構(gòu)造器,也可以是無(wú)參構(gòu)造器。
同時(shí)發(fā)現(xiàn):
繼承式匿名內(nèi)部類(lèi)的花括號(hào)內(nèi)寫(xiě)不了打印語(yǔ)句,因?yàn)槲覍?xiě)的打印語(yǔ)句println報(bào)紅,末尾分號(hào)顏色變灰色。
【報(bào)錯(cuò)1】:Cannot resolve symbol ‘println’
【報(bào)錯(cuò)2】:Unnecessary semicolon ‘;’
Inspection info: Reports on any unnecessary semicolons, whether between class members, inside block statements, or after class definitions. While valid Java, these semicolons are redundant, and may be removed.
這個(gè)和百度百科中Java內(nèi)部類(lèi)-繼承式匿名內(nèi)部類(lèi)的寫(xiě)法有出入。為什么我這邊不能用打印語(yǔ)句呢?
百度一下。沒(méi)百度到原因。有說(shuō)缺少main函數(shù)導(dǎo)致。可是我的代碼并不缺少main函數(shù)。難道是繼承式匿名內(nèi)部類(lèi)開(kāi)辟了另外一個(gè)區(qū)域,獨(dú)立于main函數(shù)了嗎?有待考證*2
結(jié)論
匿名內(nèi)部類(lèi)它是一個(gè)實(shí)例。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的匿名内部类探究——它是一个实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Bootstrap和animate.
- 下一篇: 彻底理解 Cookie、Session、