java匿名内部类通过new父类名(构造参数){...}语法继承已有具体或抽象类并实例化,必须实现所有抽象方法、不可定义构造器和静态成员,适用于快速定制行为场景。

Java 中匿名内部类通过继承具体类来创建,核心就是用 new 父类名(构造参数) { ... } 语法,在花括号里重写需要的方法,同时自动完成实例化。
必须基于已有具体类或抽象类
匿名内部类不能凭空产生,它必须明确继承一个已存在的类(可以是具体类,也可以是抽象类),但不能同时继承类又实现接口。例如,若有一个具体类 Animal:
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
就可以直接继承它,无需先定义子类:
- 使用
new Animal() { ... }创建匿名子类实例 - 花括号内必须实现所有抽象方法(如果父类是抽象类)
- 可以重写已有方法,也可新增字段或普通方法(但不能加静态成员)
注意构造器调用规则
继承具体类时,匿名内部类会隐式调用父类的构造器。如果父类只有带参构造器,就必须显式传参:
- 父类有无参构造器 →
new Animal() { ... } - 父类只有
Animal(String name)→ 必须写成new Animal("dog") { ... } - 不传参或参数类型/数量错,编译直接报错
不能是抽象类,也不能定义构造器
匿名内部类本身一定是具体类,所以:
- 若父类含抽象方法,你必须在花括号中全部实现,否则编译失败
- 不能声明构造方法(没有类名,无法定义构造器)
- 不能包含静态字段或静态方法(局部类限制)
- 可访问外部类的成员,包括 private 字段和方法
典型使用场景
常见于快速定制行为,避免为单次使用专门写子类:
- 测试中临时模拟某个类的行为
- GUI 编程中为按钮、监听器等快速提供定制逻辑
- 单元测试中替换依赖对象(如 mock 简化版)
比如临时改写 TimerTask 的 run() 方法,或定制 Comparator 的比较逻辑——虽然 Comparator 是接口,但同理,继承具体类的写法更适用于有默认行为的基类扩展。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











