匿名内部类本质是隐式继承父类(或实现接口)的子类实例,通过new父类名(参数){}语法重写非private非final方法,只能单继承且须调用可见构造器。

Java中匿名内部类通过继承父类重写方法,本质是创建一个**隐式继承指定父类(或实现接口)的子类实例**,并在定义时直接提供被重写方法的具体实现。
匿名内部类继承父类并重写方法的语法结构
匿名内部类没有显式类名,它在创建对象的同时定义类体。若父类是普通类(非final),可继承它并重写其非private、非final的实例方法:
- 语法格式:new 父类名(构造参数) { /* 重写的方法 */ };
- 必须调用父类的某个可见构造器(编译器自动插入
super(...)) - 只能重写父类中允许被覆盖的方法(public/protected,且非final)
- 不能定义构造器,但可用实例初始化块或字段初始化模拟
实际代码示例:继承抽象类并重写抽象方法
常见于Swing事件监听、线程创建等场景:
abstract class Animal {
abstract void makeSound();
void breathe() {
System.out.println("呼吸中...");
}
}
<p>Animal dog = new Animal() {
@Override
void makeSound() {
System.out.println("汪汪!");
}
// 可选择重写非抽象方法
@Override
void breathe() {
System.out.println("狗在喘气");
}
};
dog.makeSound(); // 输出:汪汪!
dog.breathe(); // 输出:狗在喘气注意事项与限制
- 匿名内部类**只能继承一个类**(Java单继承),不能同时extends和implements
- 若父类构造器是private或不可访问,编译报错
- 无法重写父类的private方法(子类根本看不到)
- 重写的方法中可访问外部方法的final局部变量、有效final变量,以及外部类的成员(含private)
- 匿名类本身是具体类,所以必须实现所有抽象方法(若父类含抽象方法)
和接口实现的区别
虽然语法相似(new 接口名() { ... }),但继承父类时关注的是“扩展已有行为”,而实现接口是“承诺具备某种能力”。前者有父类状态可复用,后者只约定方法签名。
立即学习“Java免费学习笔记(深入)”;


















