成员内部类是定义在外部类成员位置、非static的内部类,依附于外部类实例,可访问其所有成员,编译生成outer$inner.class文件,创建对象需依赖外部类实例。

在 Java 中,把一个类定义为普通的成员内部类,就是把它写在外部类的成员位置(也就是类体里、方法外),不加 static 修饰符,也不放在方法或代码块内部。
定义位置和基本语法
成员内部类必须直接嵌套在外部类的大括号内,和字段、方法处于同一层级。它本质上是外部类的一个实例成员,因此天然持有对外部类实例的引用。
- 不能用 static 修饰(否则就变成静态内部类了)
- 可以使用任意访问修饰符:private、protected、public 或默认(包级)
- 不能定义 static 字段或方法(除非是 static final 常量)
能直接访问外部类的所有成员
成员内部类可以直接使用外部类的任意成员,包括 private 字段和方法,不需要 getter/setter。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 访问同名变量时,用 OuterClass.this.fieldName 明确指定外部类成员
- 内部类自己的成员用 this.fieldName,局部变量直接用变量名
- 例如:OuterClass.this.name 指向外部类的 name,this.name 指向内部类的 name
编译后生成独立的 class 文件
Java 编译器会为每个成员内部类生成单独的字节码文件,命名格式为:外部类名$内部类名.class。
- 比如 Car 类里定义了 Engine 成员内部类,编译后会出现 Car.class 和 Car$Engine.class
- 这个命名规则也说明:内部类在 JVM 层面是独立存在的,并非语法糖
创建对象必须依赖外部类实例
因为成员内部类依附于外部类对象,所以不能脱离外部类实例单独 new。
- 在外部类内部:直接用 new InnerClass()
- 在外部类外部:先 new 外部类,再用 outerInstance.new InnerClass()
- 错误写法:new OuterClass.InnerClass()(缺少外部类实例引用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










