目標
1,匿名內部類的作用。
2,匿名內部類的定義格式。
具體內容
匿名內部類的定義:
沒有名字的內部類。表面上看起來那是它的名字,實際上不是它的名字。
使用匿名內部類的前提:
必須繼承父類或實現一個接口
匿名內部類的分類:
1.繼承式的匿名內部類
2.接口式的匿名內部類
3.參數式的匿名內部類
特點:
匿名內部類一定是跟在new的后面,用其隱含實現一個接口或一個類,沒有類名,根據多態,我們使用其父類名。因為匿名內部類屬於局部類,所以局部類的所有限制對其生效。匿名內部類是唯一一種無構造方法的類。匿名內部類在編譯時,系統自動起名Out$1.class。如果一個對象編譯時的類型是接口,那么其運行的類型為實現這個接口的類。
注意點:
1.不能有構造方法
2.不能定義任何靜態成員、方法或類
3.不能是public,protected,private,static。
4.只能創建匿名內部類的一個實例。
匿名內部類的優點:
可以使命名變得簡潔
使代碼更加緊湊,簡潔,封裝性比內部類更優
一個類用於繼承其他類或是實現接口,無需增加其他的方法,只是對繼承方法實現 覆蓋。
內部類:在一個類的內部還有另一個類。那么匿名類,如果一個類在整個操作中,只使用一次的話,就可以將其定義成匿名內部類。
匿名內部類是在接口及抽象類的基礎上發展起來的。
interface A{ public void printInfo() ; // } class B implements A{ // 實現接口 public void printInfo(){ System.out.println("Hello World!!!") ; } }; class X { public void fun1(){ this.fun2(new B()) ; } public void fun2(A a){ a.printInfo() ; } }; public class NoInnerClassDemo01{ public static void main(String args[]){ new X().fun1() ; // 實例化X類的對象,並調用fun1()方法 } };
如果此時,B類只使用一次的話,那么還有必要為其單獨定義一次嗎?
此時可以使用匿名內部類解決問題。如下:
interface A{ public void printInfo() ; // } class X { public void fun1(){ this.fun2(new A(){ //這里所做的改變就是,把原本的B類去掉,然后在括號中的new B()改成new A()(也就是接口類),
給出方法的具體實現,定義內部類。相當於把B類的寫的操作代碼直接寫到匿名內部類中。 public void printInfo(){ System.out.println("Hello World!!!") ; } } ) ; } public void fun2(A a){ a.printInfo() ; } }; public class NoInnerClassDemo02{ public static void main(String args[]){ new X().fun1() ; // 實例化X類的對象,並調用fun1()方法 } };
以上所做的是,在fun2的括號中實現接口,並且給出具體實現,其實就是匿名實現接口類,代替上一例中的B類。
總結
1,在實際開發中,會使用各種框架,在框架上會大量使用匿名內部類。
2,匿名內部類是在抽象和接口繼承上發展起來的。