在 Java 中,匿名内部类(Anonymous Inner Class)是一种没有显式命名的局部内部类,它允许你在定义类的同时直接实例化该类。这种语法糖让代码更加简洁,特别适合创建只需要使用一次的实现类。
实现语法
- 父类构造器:可以是普通类、抽象类或接口。
- 类体:包含方法实现、字段定义等,但不能有显式的构造器。
new 父类构造器(参数列表) | 接口() { // 类的实现代码 };
常见使用场景
继承抽象类
创建抽象类的匿名子类并实例化:
//1.有匿名内部类的情况 abstract class Animal { abstract void sound(); } Animal cat = new Animal() { // 继承抽象类 @Override void sound() { System.out.println("喵喵~"); } }; cat.sound(); // 调用方法 ----------------------------------------------------------------------------------------- //2.无匿名内部类 abstract class Animal { abstract void sound(); } public class Ani_mal extends Animal { //无匿名内部类时需要手动新建一个类继承 @Override void sound() { System.out.println("喵喵~"); } } Ani_mal cat = new Ani_mal(); cat.sound();
匿名内部类的特点
(1)隐式继承或实现
- 匿名内部类必须继承一个父类或实现一个接口,但不能同时继承类和实现接口。
- 只能继承一个父类或实现一个接口。
(2)没有显式的类名
- 无法使用
new
关键字再次实例化,只能在定义时创建一个对象。(3)访问外部成员
- 可以访问外部类的final 变量(Java 8+ 允许访问事实上的 final 变量)。
- 不能定义静态成员,因为匿名内部类是实例级别的。
(4)作用域局限
- 匿名内部类的作用域仅限于定义它的代码块内。
总结
匿名内部类是 Java 中一种灵活的语法糖,它允许你在需要的地方就地实现接口或继承类,避免创建大量冗余的命名类。
主要适用于:
- 创建一次性使用的实现类。
- 简化事件处理、回调函数等场景。
- 避免代码中出现过多的命名类。
但在 Java 8 及以后,对于函数式接口,推荐使用更简洁的 Lambda 表达式替代匿名内部类。