成员内部类必须通过外部类实例创建,因隐式持有outer.this引用;正确写法为new outer().new inner()或分步创建,不可直接new inner()或new outer.inner()。

在外部类外部实例化成员内部类,必须先有外部类的实例,再通过该实例创建内部类对象。不能跳过这一步直接 new,否则编译报错。
基本语法格式
标准写法是:外部类实例.new 内部类()
- 先创建外部类对象:new Outer()
- 再在其上调用内部类构造器:.new Inner()
- 完整表达式:Outer.Inner inner = new Outer().new Inner();
为什么不能直接 new Inner()?
成员内部类隐式持有一个指向外围实例的引用(Outer.this),所以它依赖于外部类对象的存在。
- 没有 Outer 实例,Inner 就无法初始化这个引用
- 编译器会强制要求你提供一个有效的 Outer 对象
- 写成 new Outer.Inner() 是错误的——缺少实例路径,语法不合法
常见写法对比
✅ 正确方式(推荐):
Outer.Inner inner = new Outer().new Inner();
✅ 分步写法(便于调试或复用):
Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();
❌ 错误写法:
-
new Outer.Inner()—— 缺少外围实例,编译失败 -
new Inner()—— Inner 不是独立类,作用域外不可见 -
Outer.Inner inner = new Inner();—— 类型匹配但构造路径缺失
访问修饰符的影响
内部类的访问权限决定它能否被外部类外部访问:
- public:任何地方都能按上述方式实例化
- protected / default:同包内可用
- private:仅外部类内部可访问,外部类外部无法实例化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











