Java内部类编译后生成独立.class文件,命名规则为“外部类名$内部类名”或“外部类名$数字”,非静态内部类隐式持有外部类引用,编译器添加合成字段和桥接方法以支持访问控制。

Java 中内部类编译后,会生成独立的 .class 文件,文件名遵循特定命名规则,与外部类分离但保持逻辑关联。
内部类字节码文件的命名规则
编译器会为每个内部类生成一个单独的 .class 文件,文件名由外部类名、美元符 $ 和内部类名组成。例如:
OuterClass.java中定义了非静态内部类Inner
→ 编译后生成OuterClass$Inner.class如果有匿名内部类(如
new Runnable() { ... })
→ 生成OuterClass$1.class、OuterClass$2.class等,按出现顺序编号-
静态内部类(
static class StaticInner)同样生成OuterClass$StaticInner.class立即学习“Java免费学习笔记(深入)”;
编译时的处理特点
- 内部类不是语法糖,而是被编译成普通类,只是访问控制和字段引用会被编译器改写
- 非静态内部类隐式持有对外部类实例的引用(编译器自动添加
final OuterClass this$0字段) - 编译器可能生成桥接方法(bridge methods)或合成字段(synthetic fields),用于支持私有成员访问(如访问外部类的 private 方法或字段)
如何验证生成的字节码文件
- 编写含内部类的 Java 源文件,执行
javac OuterClass.java - 查看当前目录:
ls *.class或dir *.class(Windows) - 用
javap -c OuterClass$Inner可反编译查看字节码指令 - 用
javap -v OuterClass$Inner查看详细结构(包括合成字段、签名、常量池等)
注意几个常见情况
- 内部类若被
private修饰,其.class文件仍会生成,只是 JVM 层面限制访问,而非编译器跳过 - 同一个源文件中多个内部类,各自生成对应
$命名的.class文件 - 模块化(Java 9+)不影响内部类的编译行为,
.class文件仍按相同规则输出到相应目录
不复杂但容易忽略


















