非静态内部类实例必须通过外部类实例创建,因其隐式持有对外部类实例的引用;正确语法为“外部类实例.new 内部类构造器()”,如outer.new inner()。

在 Java 中,非静态内部类(即成员内部类)的实例必须依附于外部类的一个实例,因此不能直接通过 new Outer.Inner() 创建。但可以通过外部类对象显式创建其内部类实例,语法是:外部类实例.new 内部类构造器()。
为什么必须通过外部类实例创建?
非静态内部类隐式持有一个指向外部类实例的引用(编译后会自动添加一个类似 Outer this$0 的合成字段),所以它依赖于外部类对象的存在。没有外部类实例,内部类实例无法初始化这个引用,编译器会报错。
正确创建方式:使用外部类对象 + new
假设外部类为 Outer,内部类为 Inner,创建步骤如下:
- 先创建外部类实例:
Outer outer = new Outer(); - 再通过该实例创建内部类实例:
Outer.Inner inner = outer.new Inner();
注意:outer.new Inner() 是完整语法,outer 是已存在的外部类对象名,不是类名;Inner 是内部类名,不加任何修饰(不能写成 outer.new Outer.Inner())。
常见错误与注意事项
-
不能用类名直接 new:如
new Outer.Inner()编译失败,因为缺少外部类实例上下文 -
不能在静态上下文中直接创建:比如在
main方法或静态方法中,必须先有外部类实例才能创建内部类实例 -
内部类构造器可带参数:如
outer.new Inner("hello"),只要构造器定义支持即可 -
类型声明可简写:如果当前作用域无歧义,可写
Inner inner = outer.new Inner();,无需写全限定名
完整示例代码
// 外部类class Outer { String name = "outer"; // 非静态内部类 class Inner { void print() { System.out.println("Accessing outer: " + name); } }}
// 使用public class Test { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); // ✅ 正确 inner.print(); // 输出:Accessing outer: outer }}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











