多层嵌套内部类实例化需按依赖链顺序创建:非静态成员内部类依赖外围实例,如Outer→Inner→MemberInner;静态嵌套类可直接实例化;访问外层成员须显式路径如Outer.this.msg;非静态内部类持有外围引用,易致内存泄漏。

多层嵌套内部类的实例化和访问,关键在于理清“谁需要谁先存在”以及“路径怎么写才准确”。不是靠背语法,而是顺着依赖链一步步操作。
明确每层创建的前提条件
嵌套越深,创建时依赖的前置对象越多:
- 成员内部类(非 static)必须依附于其直接外围类的实例——没有 Outer 实例,就不能 new Inner()
- Inner 里再定义 MemberInner(第二层嵌套),则必须先有 Inner 实例;而 Inner 又依赖 Outer 实例,所以实际需要 Outer → Inner → MemberInner 的顺序创建
- 静态嵌套类不依赖任何实例,可直接用 Outer.StaticNested 创建,无需外围对象
- 局部类(定义在方法内)只能在该方法执行时创建,且所在方法的局部变量需满足“事实 final”
实例化语法要匹配层级关系
不同嵌套层级,new 的写法完全不同:
- 成员内部类:用 outerInstance.new Inner(),例如
new Outer().new Inner() - 第二层成员内部类:先拿到第一层实例,再在其上调用 new,例如
Outer.Inner inner = new Outer().new Inner(); inner.new MemberInner() - 静态嵌套类:直接 new Outer.StaticNested(),和普通类一样
- 匿名内部类或局部类:只能在定义它的作用域内 new,不能从外部直接构造
访问外层成员必须写清路径
嵌套中同名字段或方法容易混淆,显式路径是避免错误的硬性习惯:
立即学习“Java免费学习笔记(深入)”;
- 想访问最外层 Outer 的私有字段 msg?写 Outer.this.msg,而不是直接写 msg
- 想访问中间层 Inner 的 field?写 Outer.Inner.this.field
- 静态嵌套类中不能用
Outer.this,只能访问Outer.staticField - 没写前缀时,编译器按就近原则查找,但一旦本层有同名变量,外层就被遮蔽——这不是 bug,是设计,但容易误读
注意隐式引用与生命周期风险
非静态内部类会自动持有外围实例引用,这直接影响能否安全使用:
- new 出来的 MemberInner 对象,背后藏着 Inner.this 和 Outer.this 引用
- 如果把 MemberInner 实例存进静态集合、线程池或回调监听器,整个 Outer 实例就无法被回收
- 长期存活场景下,优先用静态嵌套类 + 显式传参;若必须用非静态,考虑用 WeakReference 包装外围引用
- 不要在嵌套类里试图修改方法内的局部变量——它只是副本,改了也没用


















