匿名内部类探究——它是一个实例
目錄
- 我的學習過程
- 匿名內部類概述
- 匿名內部類探究
- 代碼驗證(匿名內部類是一個實例)
- 結論
我的學習過程
昨天想學習一下Java8新特性,看到Lambda表達式可以替代匿名內部類。我對匿名內部類不太理解,決定學習一下。并進行了下面的歸納和思考。
匿名內部類概述
繼承式匿名內部類聲明格式:
new 類名(){};接口式匿名內部類聲明格式:
new 接口名(){ //接口中方法要重寫(@Override可省略,不需要重寫接口的全部方法) ... };匿名內部類有什么特點呢?
匿名內部類探究
匿名內部類是一個實例嗎?
答:繼承式匿名內部類是一個實例,接口式匿名內部類不是一個實例。有待考證*1
我的思考:
隱名內部類由于沒有類名,就沒有自己的構造器。
對于繼承式匿名內部類來說,匿名內部類是某個特定類的子類,使用new時候,相當于通過父類構造器實例化了一個實例。
對于接口式匿名內部類來說,匿名內部類是實現了某個特定的接口,使用new的時候,相當于實現了特定接口,不是實例化。
有待考證*1
另外想法:接口式匿名內部類是一個類,使用new時,就是相當于實例化了一個對象,只是對象內部實現了特定接口,所以是一個實例。傾向于認為:接口式匿名內部類也是一個實例。
進一步考證*1
接口式匿名內部類是一個實例。
代碼驗證(匿名內部類是一個實例)
代碼文件包含(同一個包下):類:Car.java、接口:CarFun.java、main函數驗證:Test.java
類:Car.java
上圖說明:這是一個叫Car的類,它實現了CarFun接口,對接口中的drive()和stop()方法進行了重寫。
接口:CarFun.java
上圖說明:這個是叫CarFun的接口,它有drive()和stop()兩個方法。
main函數驗證:Test.java
==進一步待考證*1:==匿名內部類可以傳參數嗎?我這里示例傳了參數height的值175,所以它還是匿名內部類嗎?
進一步考證*1
去掉height參數。代碼如下:
通過第8行的zerocar.getHeight()語句打印,執行結果得到
說明:不傳參數時候,zerocar是一個實例對象,匿名內部類是一個實例。
思考:所以有參數情況下還是一個匿名內部類嗎?
暫時不知道。有待進一步考證*2
這部分在main函數下寫了繼承式匿名內部類。它是一個Car的子類,通過Car的有參構造器實例化了一個實例zerocar。
//Car的有參構造器 public Car(int height, int weight) {this.height = height;}且通過第7行的zerocar.getHeight()語句打印,執行結果得到
Height: 175進一步印證了zerocar是個實例對象。
(續上一張圖片)
這部分在main函數下寫了接口式匿名內部類。我選擇把接口CarFun里的兩個方法都進行了重寫(不一定要全部方法重寫,因為此處可以省略@Override)。并用zerocarfun調用了drive()和stop()方法。執行結果:
執行成功,說明zerocarfun可以調用方法,說明它是一個對象。所以接口式匿名內部類也是一個實例。
同時驗證了:
繼承式匿名內部類是通過父類構造器實例化,可以是有參構造器,也可以是無參構造器。
同時發現:
繼承式匿名內部類的花括號內寫不了打印語句,因為我寫的打印語句println報紅,末尾分號顏色變灰色。
【報錯1】:Cannot resolve symbol ‘println’
【報錯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.
這個和百度百科中Java內部類-繼承式匿名內部類的寫法有出入。為什么我這邊不能用打印語句呢?
百度一下。沒百度到原因。有說缺少main函數導致。可是我的代碼并不缺少main函數。難道是繼承式匿名內部類開辟了另外一個區域,獨立于main函數了嗎?有待考證*2
結論
匿名內部類它是一個實例。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的匿名内部类探究——它是一个实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Bootstrap和animate.
- 下一篇: 彻底理解 Cookie、Session、