Object类是Java所有类的父类,其toString()方法默认返回“类名@哈希码”,调试时缺乏业务信息;它在println、日志占位符、字符串拼接、集合打印中被自动调用;重写后应精简关键字段、统一格式、处理null,提升可读性。

Object 类是 Java 所有类的直接或间接父类,它的 toString() 方法就是每个对象自带的“自我介绍”能力——只要没被重写,所有对象都默认用这个方式告诉别人“我是谁”。但在调试输出中,它最常暴露的问题不是“没作用”,而是“作用太弱”:默认返回类似 Person@1b6d3586 这样的字符串,只含类名和哈希码,不带任何业务数据,对排查问题几乎没帮助。
toString 在调试输出中怎么被调用
它经常是“悄悄干活”的:你没写 .toString(),但 Java 会在这些场景自动触发:
-
System.out.println(obj)—— 直接打印对象时 -
logger.info("用户信息: {}", user)—— 日志框架格式化占位符时 -
"订单: " + order—— 字符串拼接中遇到对象时 -
System.out.println(list)—— 打印集合,内部会逐个调用元素的 toString()
不重写 toString 的调试痛点
想象你在查一个 Order 对象为什么状态不对:
- 没重写:控制台只显示
Order@7a81197d,你得手动展开、逐个调getOrderId()、getStatus()……费时且易漏 - 重写后:
Order{id=1001, status='PROCESSING', amount=299.0},一眼锁定关键字段,问题可能当场就定位了
重写 toString 的实用建议
目标不是“能用”,而是“一看就懂”。几个关键点:
立即学习“Java免费学习笔记(深入)”;
- 只包含真正重要的字段(比如 ID、状态、核心数值),避免堆砌 getter 全部塞进去
- 格式统一清晰,推荐用
ClassName{field1=value1, field2=value2}这种结构 - 注意 null 安全:字段可能为 null,拼接前做判断,比如
name == null ? "null" : "'" + name + "'" - IDE(如 IntelliJ)通常支持自动生成,右键 → Generate → toString,选字段即可,省去手写模板
本质上,toString 不是给机器看的,是给人看的。一次合理的重写,能让日志多说一句有用的话,让调试少走三步弯路。


















