匿名類是指沒有類名的內(nèi)部類,必須在創(chuàng)建時使用 new 語句來聲明類。其語法形式如下:
new<類或接口>(){
// 類的主體
};
這種形式的 new 語句聲明一個新的匿名類,它對一個給定的類進(jìn)行擴(kuò)展,或者實(shí)現(xiàn)一個給定的接口。使用匿名類可使代碼更加簡潔、緊湊,模塊化程度更高。
匿名類有兩種實(shí)現(xiàn)方式:
繼承一個類,重寫其方法。
實(shí)現(xiàn)一個接口(可以是多個),實(shí)現(xiàn)其方法。
下面通過代碼來說明。
publicclass Out{
voidshow(){
System.out.println("調(diào)用 Out 類的 show() 方法");
}
}
publicclass TestAnonymousInterClass{
// 在這個方法中構(gòu)造一個匿名內(nèi)部類
privatevoidshow(){
Out anonyInter=newOut(){
// 獲取匿名內(nèi)部類的實(shí)例
voidshow(){
System.out.println("調(diào)用匿名類中的 show() 方法");
}
};
anonyInter.show();
}
publicstaticvoidmain(String[]args){
TestAnonymousInterClass test=newTestAnonymousInterClass();
test.show();
}
}
程序的輸出結(jié)果如下:
調(diào)用匿名類中的 show() 方法
從輸出結(jié)果可以看出,匿名內(nèi)部類有自己的實(shí)現(xiàn)。
提示:匿名內(nèi)部類實(shí)現(xiàn)一個接口的方式與實(shí)現(xiàn)一個類的方式相同,這里不再贅述。
匿名類有如下特點(diǎn):
1)匿名類和局部內(nèi)部類一樣,可以訪問外部類的所有成員。如果匿名類位于一個方法中,則匿名類只能訪問方法中 final 類型的局部變量和參數(shù)。
publicstaticvoidmain(String[]args){
inta=10;
finalintb=10;
Out anonyInter=newOut(){
voidshow(){
// System.out.println("調(diào)用了匿名類的 show() 方法"+a);? ? // 編譯出錯
System.out.println("調(diào)用了匿名類的 show() 方法"+b);// 編譯通過
}
};
anonyInter.show();
}
從?Java?8 開始添加了?Effectively final 功能,在 Java 8 及以后的版本中代碼第 6 行不會出現(xiàn)編譯錯誤,詳情可點(diǎn)擊《Java8新特性之Effectively final》進(jìn)行學(xué)習(xí)。
2)匿名類中允許使用非靜態(tài)代碼塊進(jìn)行成員初始化操作。
Out anonyInter=newOut(){
inti;{// 非靜態(tài)代碼塊
i=10;//成員初始化
}
publicvoidshow(){
System.out.println("調(diào)用了匿名類的 show() 方法"+i);
}
};
3)匿名類的非靜態(tài)代碼塊會在父類的構(gòu)造方法之后被執(zhí)行。