匿名內部類的使用


目標

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,匿名內部類是在抽象和接口繼承上發展起來的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM