java內(nèi)部匿名類

前言:
java基礎(chǔ)的編寫類的時(shí)候,會(huì)覺得很匿名內(nèi)部類很神秘.普通的java文件會(huì)被編譯成class,那內(nèi)部類和匿名內(nèi)部類呢?它們被會(huì)存在在哪個(gè)物理位置?
本文主要針對(duì)匿名內(nèi)部類.

本文中有ISay和ISay2兩個(gè)接口,用于測(cè)試對(duì)比.

ISay.java

public interface ISay {
     void sayHello();
 }

ISay2.java

public interface ISay2 {
     void sayHello222();

     void print();
 }

Program.java

public class Program {
    public static void main(String[] args) {
        ISay say = new ISay() {
            public void sayHello() {
                System.out.println("Hello java!");
            }
        };

        ISay say2 = new ISay() {
            public void sayHello() {
                System.out.println("Hello java!");
            }
        };

        ISay say3 = new ISay() {
            public void sayHello() {
                System.out.println("Hello java!");
            }
        };


        ISay2 say2_1 = new ISay2() {
            public void sayHello222() {
                System.out.println("Hello java!");
            }

            public void print(){
                System.out.print("print");
            }
        };
 
        say.sayHello();
        say2.sayHello();
        say2_1.sayHello222();
        say2_1.print();
    }
}

生成的class文件如下圖:
ISay.java

public interface ISay {
     void sayHello();
 }

ISay2.java

public interface ISay2 {
     void sayHello222();

     void print();
 }

Program.java

public class Program {
    public static void main(String[] args) {
        ISay say = new ISay() {
            public void sayHello() {
                System.out.println("Hello java!");
            }
        };

        ISay say2 = new ISay() {
            public void sayHello() {
                System.out.println("Hello java!");
            }
        };

        ISay say3 = new ISay() {
            public void sayHello() {
                System.out.println("Hello java!");
            }
        };


        ISay2 say2_1 = new ISay2() {
            public void sayHello222() {
                System.out.println("Hello java!");
            }

            public void print(){
                System.out.print("print");
            }
        };
 
        say.sayHello();
        say2.sayHello();
        say2_1.sayHello222();
        say2_1.print();
    }
}

生成的class文件如下圖:


6863841.png

發(fā)現(xiàn)會(huì)有Program$1.class等文件,其實(shí)這就是匿名類的class文件.

使用jclasslib查看Program.class字節(jié)碼
###是注釋,不是字節(jié)碼的內(nèi)容

new #2 <NewInterface/Program$1>                      ###對(duì)應(yīng)代碼ISay say = new Program$1() ,Program$1是ISay的實(shí)現(xiàn)。
dup                                                                                                                                                                                                       
invokespecial #3 <NewInterface/Program$1.<init>>
astore_1                                             ###存放引用在變量1中

new #4 <NewInterface/Program$2>
dup
invokespecial #5 <NewInterface/Program$2.<init>>
astore_2

new #6 <NewInterface/Program$3>
dup
invokespecial #7 <NewInterface/Program$3.<init>>
astore_3

new #8 <NewInterface/Program$4>
dup
invokespecial #9 <NewInterface/Program$4.<init>>
astore 4

aload_1                                                      ###加載本地變量1的引用,即上述的NewInterface/Program$1
invokeinterface #10 <NewInterface/ISay.sayHello> count 1     ###調(diào)用方法,對(duì)象是本地變量1的實(shí)例。

aload_2
invokeinterface #10 <NewInterface/ISay.sayHello> count 1

aload 4                                                      ###加載本地變量4的引用,即上述的NewInterface/Program$4
invokeinterface #11 <NewInterface/ISay2.sayHello222> count 1 ###調(diào)用方法,對(duì)象是本地變量4的實(shí)例。

aload 4
invokeinterface #12 <NewInterface/ISay2.print> count 1
return

內(nèi)部類跟匿名內(nèi)部類的class生成規(guī)則差不多,只不過匿名內(nèi)部類是由編譯器命令,內(nèi)部類是直接指定.
例如:Program中有一個(gè)內(nèi)部類叫Book,那么生成的class文件是Program$Book.class

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容