匿名内部类适合接口单抽象方法且逻辑简短、不需复用的场景,如事件监听、线程启动;Java 8后多被Lambda替代,但对多方法接口或需访问非final局部变量时仍有价值,语法为new 接口() { @Override public void method() { ... } };

Java 中创建匿名内部类来实现接口,是一种快速、简洁的写法,特别适合只用一次的简单逻辑,比如事件监听、线程启动、函数式接口调用等。
什么时候适合用匿名内部类
当接口只有一个抽象方法(或你只关心其中一个方法),且实现逻辑较短、不需复用时,匿名内部类比单独定义一个类更轻量。Java 8 之后,这类场景更多被 Lambda 表达式替代;但对多方法接口(如 MouseListener)、或需要访问外部局部变量又不想改 final 修饰时,匿名内部类仍有实用价值。
基本语法结构
匿名内部类没有类名,直接在 new 后面写接口名或父类名,然后用大括号提供实现体:
new 接口名() {
// 实现接口中所有抽象方法
@Override
public void 方法名() {
// 具体逻辑
}
};
常见使用示例
1. 实现 Runnable 启动线程
立即学习“Java免费学习笔记(深入)”;
不用额外定义类,直接内联实现:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程执行中");
}
}).start();
2. Swing/AWT 事件监听
例如给按钮添加点击响应:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点了");
}
});
3. 自定义单方法接口(兼容老版本 Java)
interface Calculator {
int compute(int a, int b);
}
// 匿名内部类实现
Calculator add = new Calculator() {
@Override
public int compute(int a, int b) {
return a + b;
}
};
System.out.println(add.compute(3, 5)); // 输出 8
注意事项
- 匿名内部类不能有构造器,但可以有实例初始化块
- 能访问外部方法的 final 或事实 final 的局部变量(Java 8+ 放宽了限制,只要没被重新赋值即可)
- 如果接口是泛型的(如
Comparable<String>),需在 new 后明确类型参数:new Comparable<String>(){...} - 匿名内部类本质是一个继承自父类或实现接口的子类,因此每个 new 都会生成一个独立的 .class 文件(编译后可见)
不复杂但容易忽略:它不是语法糖,而是一个真实类,只是编译器帮你命名(如 OuterClass$1.class)。现代开发中,优先考虑 Lambda(针对函数式接口)或私有静态嵌套类(需复用或逻辑较重),匿名内部类更适合“一次性、轻量、上下文强依赖”的场景。


















