匿名对象是不赋值给变量、直接创建并使用的对象,适用于只调用一次方法或传参的场景;语法为new 类名()后紧跟方法调用或作为参数传递,如new Person().sayHello()或printName(new Student()),其生命周期短暂、不可复用,也无引用可访问。

Java 中匿名对象就是不赋值给变量、直接创建并使用的对象,常用于只调用一次方法或传参的场景,简洁高效。
匿名对象的基本写法
语法就是在 new 关键字后紧跟类名和括号,后面直接跟点号调用方法或作为参数传递,不写变量名和等号:
- new Person().sayHello(); —— 创建 Person 实例并立即调用 sayHello 方法
- printName(new Student()); —— 把新创建的 Student 对象直接传给 printName 方法
适合用匿名对象的典型场景
当对象只需用一次、无需后续访问时,匿名对象能减少冗余代码:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 调用工具类的静态方法前需传入某个对象(如 new Date() 传给格式化方法)
- 向接口回调、监听器、Comparator 等函数式参数传临时实现(配合 Lambda 更常见,但匿名对象仍适用)
- 测试中快速构造一个简单对象用于断言,比如 new ArrayList(Arrays.asList(1,2,3))
注意生命周期和限制
匿名对象没有引用指向它,方法调用结束后就失去强引用,可能被 GC 回收:
立即学习“Java免费学习笔记(深入)”;
- 不能重复使用 —— 每次 new 都是全新对象
- 无法读取其属性(除非在 new 后链式调用 getter,但一般不这么做)
- 若需多次调用或保存状态,必须声明变量,比如 Person p = new Person(); p.setName("Tom"); p.speak();
和 Lambda 的区别提醒
匿名对象 ≠ Lambda 表达式。Lambda 只适用于函数式接口(只有一个抽象方法),而匿名对象可用于任意类或抽象类实例化:
- new Runnable() { public void run() { ... } } 是匿名内部类对象(不是 Lambda)
- () -> {...} 是 Lambda,本质是编译器生成的函数式接口实现,更轻量

















