1.18 Java匿名类,匿名内部类
匿名類是指沒(méi)有類名的內(nèi)部類,必須在創(chuàng)建時(shí)使用 new 語(yǔ)句來(lái)聲明類。其語(yǔ)法形式如下:
new <類或接口>() {// 類的主體 };這種形式的 new 語(yǔ)句聲明一個(gè)新的匿名類,它對(duì)一個(gè)給定的類進(jìn)行擴(kuò)展,或者實(shí)現(xiàn)一個(gè)給定的接口。使用匿名類可使代碼更加簡(jiǎn)潔、緊湊,模塊化程度更高。
匿名類有兩種實(shí)現(xiàn)方式:
下面通過(guò)代碼來(lái)說(shuō)明。
public class Out {void show() {System.out.println("調(diào)用 Out 類的 show() 方法");} } public class TestAnonymousInterClass {// 在這個(gè)方法中構(gòu)造一個(gè)匿名內(nèi)部類private void show() {Out anonyInter = new Out() {// 獲取匿名內(nèi)部類的實(shí)例void show() {System.out.println("調(diào)用匿名類中的 show() 方法");}};anonyInter.show();}public static void main(String[] args) {TestAnonymousInterClass test = new TestAnonymousInterClass();test.show();} }程序的輸出結(jié)果如下:
調(diào)用匿名類中的 show() 方法從輸出結(jié)果可以看出,匿名內(nèi)部類有自己的實(shí)現(xiàn)。
提示:匿名內(nèi)部類實(shí)現(xiàn)一個(gè)接口的方式與實(shí)現(xiàn)一個(gè)類的方式相同,這里不再贅述。
例2:
最常用的情況就是在多線程的實(shí)現(xiàn)上,因?yàn)橐獙?shí)現(xiàn)多線程必須繼承Thread類或是繼承Runnable接口
在這里我們看到使用匿名內(nèi)部類我們必須要繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口,當(dāng)然也僅能只繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口。同時(shí)它也是沒(méi)有class關(guān)鍵字,這是因?yàn)槟涿麅?nèi)部類是直接使用new來(lái)生成一個(gè)對(duì)象的引用。當(dāng)然這個(gè)引用是隱式的。
無(wú)翼鳥能夠飛10米
在Test類中,test()方法接受一個(gè)Bird類型的參數(shù),同時(shí)我們知道一個(gè)抽象類是沒(méi)有辦法直接new的,我們必須要先有實(shí)現(xiàn)類才能new出來(lái)它的實(shí)現(xiàn)類實(shí)例。所以在mian方法中直接使用匿名內(nèi)部類來(lái)創(chuàng)建一個(gè)Bird實(shí)例。
由于匿名內(nèi)部類不能是抽象類,所以它必須要實(shí)現(xiàn)它的抽象父類或者接口里面所有的抽象方法。
匿名類有如下特點(diǎn):
1)匿名類和局部?jī)?nèi)部類一樣,可以訪問(wèn)外部類的所有成員。如果匿名類位于一個(gè)方法中,則匿名類只能訪問(wèn)方法中 final 類型的局部變量和參數(shù)。
public static void main(String[] args) {int a = 10;final int b = 10;Out anonyInter = new Out() {void show() {// System.out.println("調(diào)用了匿名類的 show() 方法"+a); // 編譯出錯(cuò)System.out.println("調(diào)用了匿名類的 show() 方法"+b); // 編譯通過(guò)}};anonyInter.show(); }從 Java 8 開始添加了 Effectively final 功能,在 Java 8 及以后的版本中代碼第 6 行不會(huì)出現(xiàn)編譯錯(cuò)誤,
2)匿名類中允許使用非靜態(tài)代碼塊進(jìn)行成員初始化操作。
Out anonyInter = new Out() {int i; { // 非靜態(tài)代碼塊i = 10; //成員初始化}public void show() {System.out.println("調(diào)用了匿名類的 show() 方法"+i);} };3)匿名類的非靜態(tài)代碼塊會(huì)在父類的構(gòu)造方法之后被執(zhí)行。
注意事項(xiàng)
在使用匿名內(nèi)部類的過(guò)程中,我們需要注意如下幾點(diǎn):
1、使用匿名內(nèi)部類時(shí),我們必須是繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口,但是兩者不可兼得,同時(shí)也只能繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口。
2、匿名內(nèi)部類中是不能定義構(gòu)造函數(shù)的。
3、匿名內(nèi)部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法。
4、匿名內(nèi)部類為局部?jī)?nèi)部類,所以局部?jī)?nèi)部類的所有限制同樣對(duì)匿名內(nèi)部類生效。
5、匿名內(nèi)部類不能是抽象的,它必須要實(shí)現(xiàn)繼承的類或者實(shí)現(xiàn)的接口的所有抽象方法。
總結(jié)
以上是生活随笔為你收集整理的1.18 Java匿名类,匿名内部类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1.17 局部内部类
- 下一篇: java美元兑换,(Java实现) 美元