成员内部类对象必须依附于外部类实例,不能直接new创建;正确方式为先创建外部类对象再通过outer.new Inner()创建,或在外部类方法中封装创建逻辑。

Java 中成员内部类(非静态内部类)的对象必须依附于外部类的实例,不能直接通过 new InnerClass() 创建。
必须先有外部类实例
成员内部类持有对外部类实例的隐式引用,因此创建其对象前,必须先创建外部类对象。这是最核心的限制。
- 错误写法:Inner inner = new Inner();(编译不通过)
- 正确写法:Outer outer = new Outer(); Inner inner = outer.new Inner();
创建和初始化的两种常用方式
可以在同一语句中完成外部类实例化、内部类实例化及初始化,也可以分步操作。
-
分步写法(清晰易读):
Outer outer = new Outer();<br> Outer.Inner inner = outer.new Inner();<br> inner.setValue(100); // 调用方法初始化 -
链式写法(简洁):
Outer.Inner inner = new Outer().new Inner(); // 匿名外部实例
注意:这种方式创建的内部类对象仍持有对那个临时Outer实例的引用,若外部实例不再被引用,可能影响内部对象生命周期。
构造器传参实现初始化
如果内部类有带参构造器,可在 new 时直接传入参数,完成初始化。
立即学习“Java免费学习笔记(深入)”;
- 定义:
class Inner { Inner(String name) { this.name = name; } } - 使用:
Outer outer = new Outer();<br> Outer.Inner inner = outer.new Inner("hello");
在外部类方法中直接创建更自然
实际开发中,常在外部类的方法内创建内部类对象,此时可直接访问外部类成员,逻辑更紧凑。
- 示例:
public Inner createInner(String s) { return new Inner(s); }
调用:Outer outer = new Outer();<br> Outer.Inner inner = outer.createInner("test"); - 这种写法避免了显式写
outer.new Inner(),也便于封装初始化逻辑。


















