匿名内部类是java中无类名的内部类,用于单次实现接口或继承类,适用于事件监听、线程启动、自定义排序等场景;其语法为new 父类/接口() {重写方法},不可定义构造器,仅能访问final或effectively final变量。

匿名内部类是 Java 中一种没有名字的内部类,通常用于简化代码,特别是在需要快速实现接口或继承抽象类、且该实现只使用一次的场景下。
什么时候该用匿名内部类
当你只需要一个类的单次实例,并且这个类只是对某个接口或抽象类的简单实现时,用匿名内部类最简洁。比如事件监听、线程启动、集合排序比较器等。
- 实现 Runnable 启动线程
- 为按钮添加 ActionListener
- 传入 Comparator 进行自定义排序
- 重写抽象方法(如 TimerTask)
基本语法结构
匿名内部类必须基于一个已存在的类型(接口或抽象/具体类)来创建,语法格式如下:
// 重写方法或实现抽象方法
public void methodName() { ... }
};
注意:如果父类有带参构造器,括号里必须传对应参数;如果是接口,则括号始终为空。
常见使用示例
1. 实现接口(Runnable)
new Thread(new Runnable() {@Override
public void run() {
System.out.println("线程运行中");
}
}).start();
2. 继承抽象类(TimerTask)
Timer timer = new Timer();timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("定时任务执行");
}
}, 1000);
3. Lambda 替代提示(Java 8+)
很多匿名内部类可被 Lambda 表达式替代,前提是接口是函数式接口(仅一个抽象方法)。例如上面的 Runnable 可简写为:
使用注意事项
- 不能定义构造方法(因为没类名)
- 不能有静态成员(除静态常量
public static final) - 只能访问所在作用域的 final 或 effectively final(事实不变)变量
- 编译后会生成类似
OuterClass$1.class的独立字节码文件 - 过度嵌套或逻辑复杂时建议改用普通内部类或独立类,提升可读性与可维护性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











