匿名内部类的使用场景和限制?
请详细解释Java中匿名内部类的定义、语法、典型使用场景以及局限性。对比Java 8 Lambda表达式,说明匿名内部类与Lambda的关系和区别。
回答
小字辈
匿名内部类:没有名字的内部类,在创建对象时直接定义类体。语法:new 父类/接口(){ 类体 }
典型场景:
// 事件监听
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { ... }
});
// 线程
new Thread(new Runnable() {
public void run() { ... }
}).start();
限制:
- 只能使用一次,不能重复引用
- 不能有构造方法(用实例初始化块代替)
- 只能访问final或effectively final的局部变量
- 可读性差,代码臃肿
与Lambda关系:Lambda(Java 8)是函数式接口的匿名内部类的简化写法。Lambda更简洁,但this指向不同(Lambda中this指向外部类,匿名内部类中this指向自身)。Lambda只能用于函数式接口(只有一个抽象方法)。