非静态内部类可访问外部类所有成员;静态内部类仅能访问外部类静态成员;局部/匿名内部类可访问外部类成员,但方法局部变量须为final或有效final。

内部类访问外部类变量,关键看它是静态还是非静态,以及变量本身是静态还是实例的——规则清晰,但容易混淆。
非静态内部类:能直接访问所有外部类成员
成员内部类(即没加 static 的内部类)天然持有对外部类实例的隐式引用(编译后叫 this$0),所以它可以直接读写外部类的:
- 任意访问权限的实例变量(private、protected、默认、public)——比如直接写
name或doWork() - 任意访问权限的静态变量和静态方法——比如直接用
COUNT或调用log() - 若内部类与外部类有同名字段,用
OuterClass.this.fieldName明确访问外部类实例变量;静态成员则用OuterClass.staticField
静态内部类:只能访问外部类的静态成员
静态内部类不依赖外部类实例,因此没有 this<p>静态内部类不依赖外部类实例,因此没有 <code>this$0 引用。它访问外部类变量时受限明显:
- 可直接使用外部类所有 static 成员,包括 private static 字段和方法——无需前缀,如
count++或helper() - 无法访问任何实例变量或实例方法——写
instanceVar或调用doSomething()会编译报错 - 真要访问实例成员?必须显式创建外部类对象:
new OuterClass().instanceVar,注意生命周期和开销
局部内部类和匿名内部类:按变量位置分规则
定义在方法或代码块里的内部类,访问外部变量要兼顾作用域和生命周期:
- 外部类的实例变量和静态变量:照常可访问,规则同非静态内部类
- 所在方法的局部变量或形参:必须是 final 或“有效 final”(Java 8+),编译器会把值拷贝进内部类,不是共享引用
- 不能访问普通局部变量——哪怕只读也不行,否则编译失败
常见误区提醒
出错往往不是语法写错,而是误判了变量归属:
- 把静态内部类当成能访问实例成员的“普通内部类”
- 在方法里改了局部变量后又在内部类中引用它,触发“非有效 final”错误
- 同名字段未用
Outer.this.xxx区分,导致读错值 - 以为 private 静态成员需要 getter——其实静态内部类可直接读写
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











