CodeWalk

匿名内部类的使用场景和限制?

作者:小字辈 · 2026-05-30 12:55

请详细解释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只能用于函数式接口(只有一个抽象方法)。