wangshuo'blog

wangshuo'blog

java | 匿名内部类简单刨析

java | 匿名内部类简单刨析

什么是匿名内部类

匿名类是指没有类名的内部类。

演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @author rosercode
* @date 2023/7/17 14:16
*/

public class AnonymousClassExample {

public static void main(String[] args) {

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World");
}
}).start();
}
}

上面的代码在编译后会生成一个 AnonymousClassExample 类和 AnonymousClassExample1.class

image-20230717152906533

AnonymousClassExample$1.class 的内容如果我们反汇编 class 文件后,是下面的内容

image-20230717153657902

总结

匿名内部类是 java 提供的一种语法糖

1
本质上是 java 的编译器在编译 java 文件到 class 文件的过程中,为匿名内部类生成一个类,并将其作为一个独立的类文件进行编译。
1
这种语法糖类似于 构造方法的语法糖:没有定义构造方法会自动生成一个无参的构造法方法。
1
如果你直接定义一个 AnonymousClassExample$1 的类(实现 Runnable),效果是一样的。

扩展

java 编译器为 匿名内部类 分配名称的规则: 外部类名 + 序号。

如果我们使用了两次匿名内部类,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class AnonymousClassExample {


public static void main(String[] args) {

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World");
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World");
}
}).start();
}
}

编译后输出如下

image-20230717154807840

参考