java 匿名类编译出来的文件夹_java内部匿名类

前言:

java基础的编写类的时候,会觉得很匿名内部类很神秘.普通的java文件会被编译成class,那内部类和匿名内部类呢?它们被会存在在哪个物理位置?

本文主要针对匿名内部类.

本文中有ISay和ISay2两个接口,用于测试对比.

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文件如下图:

e269f3ee3512913f2544289fcca4e79c.png

发现会有Program$1.class等文件,其实这就是匿名类的class文件.

使用jclasslib查看Program.class字节码

###是注释,不是字节码的内容

new #2 ###对应代码ISay say = new Program$1() ,Program$1是ISay的实现。

dup

invokespecial #3 >

astore_1 ###存放引用在变量1中

new #4

dup

invokespecial #5 >

astore_2

new #6

dup

invokespecial #7 >

astore_3

new #8

dup

invokespecial #9 >

astore 4

aload_1 ###加载本地变量1的引用,即上述的NewInterface/Program$1

invokeinterface #10 count 1 ###调用方法,对象是本地变量1的实例。

aload_2

invokeinterface #10 count 1

aload 4 ###加载本地变量4的引用,即上述的NewInterface/Program$4

invokeinterface #11 count 1 ###调用方法,对象是本地变量4的实例。

aload 4

invokeinterface #12 count 1

return

内部类跟匿名内部类的class生成规则差不多,只不过匿名内部类是由编译器命令,内部类是直接指定.

例如:Program中有一个内部类叫Book,那么生成的class文件是Program$Book.class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值