重写 toString() 是为了提供有意义的对象字符串表示。默认 Object.toString() 仅返回类名加哈希码,不利于调试;应重写为包含关键字段的格式(如 Person{name='Alice', age=30}),推荐用 @Override、Objects.toString() 或 Lombok @ToString,并确保无副作用、不返回 null。

Java 中调用 toString() 方法,本质是让对象返回一个有意义的字符串表示。默认情况下,Object 类提供的 toString() 只返回类名加哈希码(如 ClassName@1b6d3586),实际开发中几乎总是需要重写它。
为什么要重写 toString()
默认实现对调试和日志输出帮助很小,无法反映对象的实际状态。比如一个 Person 对象,我们更希望看到 Person{name='Alice', age=30} 而不是 Person@2a139a55。
如何正确重写 toString()
在自定义类中用 @Override 注解声明,并返回包含关键字段的字符串。推荐使用 String.format、字符串拼接或现代工具类(如 Objects.toString()、Lombok 的 @ToString)。
- 手动编写时,确保字段值安全(避免空指针),可用
Objects.toString(field, "null")处理可能为null的字段 - IDE(如 IntelliJ IDEA 或 Eclipse)可自动生成
toString(),支持选择哪些字段参与、是否包含类名、是否换行等 - 若使用 Lombok,只需在类上加
@ToString,编译时自动注入,简洁且不易出错
什么时候会被自动调用
不需要显式写 .toString() —— 很多场景下 JVM 会隐式调用:
- 打印对象:
System.out.println(person) - 字符串拼接:
"info: " + person - 日志输出(如 SLF4J):
log.info("User: {}", user) - 集合转字符串:
System.out.println(Arrays.asList(p1, p2))
注意事项
toString() 应该是无副作用的、线程安全的、尽量轻量的操作。不要在其中做 I/O、网络请求或修改对象状态。
- 避免返回
null,必须返回字符串(哪怕空字符串) - 如果对象字段很多或结构复杂,可考虑只输出核心字段,或提供简略版(如加参数控制)
- 测试时可验证返回值是否包含预期字段和格式,尤其注意
null值处理是否合理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











