什么是匿名內部類,如何使用匿名內部類


匿名內部類

匿名內部類,就是沒有名字的一種嵌套類。它是Java對類的定義方式之一。

為什么要使用匿名內部類

在實際開發中,我們常常遇到這樣的情況:一個接口/類的方法的某個實現方式在程序中只會執行一次,但為了使用它,我們需要創建它的實現類/子類去實現/重寫。此時可以使用匿名內部類的方式,可以無需創建新的類,減少代碼冗余

下面詳細說明一下

假設當前有一個接口,接口中只有一個方法

public interface Interface01 {
    void show();
}

為了使用該接口的show方法,我們需要去創建一個實現類,同時書寫show方法的具體實現方式

public class Interface01Impl implements Interface01{
    @Override
    public void show() {
        System.out.println("I'm a impl class...");
    }
}

如果實現類Interface01Impl全程只使用一次,那么為了這一次的使用去創建一個類,未免太過麻煩。我們需要一個方式來幫助我們擺脫這個困境。匿名內部類則可以很好的解決這個問題。

我們使用匿名內部類

public static void main(String[] args) {
    Interface01 interface01 = new Interface01() {
        @Override
        public void show() {
            System.out.println("這里使用了匿名內部類");
        }
    };
    //調用接口方法
    interface01.show();
}

成功運行結果

這里使用了匿名內部類

如何使用匿名內部類

基本格式

new 接口/類名(參數1, 參數2...){
    實現方法1(){
        
    }
    實現方法2(){
        
    }
    ......
};

在上文的使用中,我們沒有創建實現類就實現了具體的show方法。同時定義了接口的對象變量interface01。我們發現,這個變量和平常使用多態后的使用方式沒有區別。

通常,我們也習慣用這樣的方式創建並啟動線程

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("我是一個線程");
    }
}).start();

常見問題

  1. 匿名內部類是怎么實現的

    在上文代碼編譯后,我們查看一下class文件的路徑

    匿名內部類編譯后結果

    再反編譯一下看看

    反編譯后結果

    至此,我們可以得知,匿名內部類在編譯期間,會生成一個名稱以$編號結尾的class文件,即它被識別為一個真實的類,僅在編譯前(java文件)為匿名的形態。

  2. 匿名內部類只可以使用在接口上嗎

    不是的。匿名內部類可以用在具體類、抽象類、接口上,且對方法個數沒有要求。

    舉例說明:設存在具體類Class01,抽象類AbstractClass01,接口Interface01

    //具體類
    public class Class01 {
        public void show(String s){
            System.out.println("啦啦啦");
        }
    }
    
    //抽象類
    public abstract class AbstractClass01 {
        abstract void show(String s);
    }
    
    //接口
    public interface Interface01 {
        void show(String s);
    }
    

    測試類TestInner

    public class TestInner {
        public static void main(String[] args) {
            
            //重寫具體類的方法
            new Class01(){
                @Override
                public void show(String s) {
                    System.out.println("我是一個" + s);
                }
            }.show("具體類");
    
            //重寫抽象類的抽象方法
            new AbstractClass01(){
                @Override
                void show(String s) {
                    System.out.println("我是一個" + s);
                }
            }.show("抽象類");
    
            //實現接口的抽象方法
            new Interface01(){
                @Override
                public void show(String s) {
                    System.out.println("我是一個" + s);
                }
            }.show("接口");
    
    
        }
    }
    

    運行結果

    我是一個具體類
    我是一個抽象類
    我是一個接口


免責聲明!

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



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