匿名内部类是Java中定义并实例化接口或抽象类的简洁方式,适用于单次使用场景;语法为new接口名(){...}或new抽象类名(参数){...},需实现全部抽象方法,可访问final或effectively final局部变量及外部类成员。

Java 中的匿名内部类是一种在创建对象时直接定义并实现接口或抽象类的简洁方式,适合只用一次的场景。它省去单独定义类的步骤,让代码更紧凑、意图更明确。
匿名内部类的基本写法
语法结构统一为:new 接口名() { ... } 或 new 抽象类名(参数) { ... }。大括号内必须实现所有抽象方法,也可以添加自己的字段或方法(但外部无法访问)。
- 实现接口时,必须覆盖该接口中全部抽象方法
- 继承抽象类时,必须实现其所有抽象方法;若父类有带参构造器,需在 new 后显式传入参数
- 不能有显式构造器,但可以使用实例初始化块
常见使用场景示例
最典型的用途是快速响应事件、启动线程、或临时定制行为。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- 启动线程: Runnable r = new Runnable() { public void run() { System.out.println("运行中"); } }; new Thread(r).start();
- GUI 事件监听: button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("按钮被点击"); } });
- 实现自定义比较器: Collections.sort(list, new Comparator
() { public int compare(String a, String b) { return b.length() - a.length(); } });
访问外部变量的限制
匿名内部类可直接访问所在方法的final 或 effectively final局部变量,以及外部类的所有成员(包括 private 字段和方法)。
立即学习“Java免费学习笔记(深入)”;
- Java 8 起放宽了限制:只要变量在初始化后未被重新赋值,即使没写 final 也被视为 effectively final
- 若尝试修改局部变量,编译会报错;但可安全读取或调用其方法
- 访问外部类 this 引用时,隐式持有对外部类实例的强引用,需注意内存泄漏风险(尤其在长生命周期对象中)
与 Lambda 表达式的对比要点
Lambda 是 Java 8 引入的更轻量替代方案,但仅适用于函数式接口(仅含一个抽象方法的接口)。
- 匿名内部类能实现多方法接口、继承具体类、声明字段,Lambda 不能
- Lambda 无法直接访问非 final 局部变量,但语义上更接近“函数”而非“类”
- 当需要复用逻辑、捕获状态或实现复杂行为时,匿名内部类仍有不可替代性

















