成员内部类必须依附外部类实例,用outer.new inner()创建;静态内部类可独立存在,直接new outer.staticinner()即可,且仅能访问外部类静态成员。

Java 中内部类的创建和使用,关键在于理解它和外部类之间的依赖关系,以及不同种类内部类的语法差异。核心原则是:非静态内部类必须依附于外部类实例,而静态内部类则可独立存在。
成员内部类(最常见)
定义在外部类中、方法之外,不加 static 修饰。它天然持有对外部类实例的引用,因此能直接访问外部类所有成员(包括私有字段和方法)。
- 创建方式有两种:
① 先创建外部类对象,再用外部类实例.new 内部类():Outer outer = new Outer();<br> Outer.Inner inner = outer.new Inner();
② 在外部类内部提供一个返回内部类实例的方法(更常用):public Inner getInner() { return new Inner(); } - 不能定义静态成员(除静态常量
static final外) - 若内外类有同名变量,内部类中用
Outer.this.field显式访问外部类字段
静态内部类
用 static 修饰的成员内部类。它不持有外部类实例引用,因此无法直接访问外部类的非静态成员。
- 创建无需外部类实例:
Outer.StaticInner si = new Outer.StaticInner();
或简写为:new Outer.StaticInner(); - 可直接访问外部类的静态成员;访问非静态成员需显式创建外部类对象
- 适合工具类、配置类等与外部类状态无关的场景
局部内部类
定义在方法或代码块内部,作用域仅限于该方法。它能访问所在方法的 final 或“事实上 final”的局部变量,以及外部类所有成员。
- 不能用
public、private、protected或static修饰 - 通常用于封装一段只在当前方法中使用的逻辑,增强可读性
- 编译后生成独立的
外部类$1.class类文件(数字按声明顺序递增)
匿名内部类
没有类名的局部内部类,常用于快速实现接口或继承抽象类,尤其在事件监听、线程启动等场景中高频使用。
- 语法格式:
new 接口名() { /* 实现方法 */ };
或new 抽象类名(参数) { /* 重写方法 */ }; - 只能使用一次,不能重复实例化
- 隐式继承自指定父类或实现指定接口,且自动调用其构造器
- 访问所在作用域的局部变量时,该变量必须是 final 或事实 final(Java 8+)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











