java匿名内部类通过new+接口/抽象类名+{}创建未命名子类实例,可实现接口或继承抽象类;必须实现所有抽象方法,不能有构造器,仅能继承一个类或实现一个接口,jdk8+推荐lambda替代单方法场景。

Java 中匿名内部类通过 new 关键字 + 接口名或抽象类名 + 大括号 的形式,直接创建一个未命名的子类实例,从而实现接口或继承抽象类。
实现接口的匿名内部类
当接口只有一个抽象方法(如函数式接口),匿名内部类常用于快速提供实现;即使有多个方法,也可以只写需要重写的部分。
- 语法格式:new 接口名() { 重写方法体 };
- 必须实现接口中所有抽象方法(除非是默认方法或静态方法)
- 不能有构造器,但可以有初始化块或局部变量
- 示例:实现 Runnable 接口
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("线程执行中");
}
};
继承抽象类的匿名内部类
匿名内部类也可以继承抽象类,只需实现其中所有未被子类覆盖的抽象方法。
- 语法格式:new 抽象类名(构造参数) { 实现抽象方法 };
- 若抽象类有带参构造器,必须传入对应参数
- 可访问外部类的 final 局部变量、实例变量和静态变量
- 示例:继承抽象类 Animal
abstract class Animal {
abstract void makeSound();
}
Animal dog = new Animal() {
@Override
void makeSound() {
System.out.println("汪汪!");
}
};
注意事项和限制
匿名内部类不是万能写法,使用时需注意语言层面的约束。
- 只能继承一个类(包括抽象类)或实现一个接口,不能同时做两件事
- 不能定义静态成员(除静态 final 常量外)
- 不能是抽象的,必须提供完整实现(即所有抽象方法都有具体逻辑)
- 编译后生成形如 OuterClass$1.class 的独立字节码文件
- JDK 8+ 更推荐用 Lambda 表达式替代单方法接口的匿名类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











