重写 toString 方法的核心是返回能清晰、简洁、有意义地描述对象状态的字符串,通常包含关键字段值,避免默认类名+哈希码形式;需 null 安全、不耗时、无副作用、防循环引用。

重写 toString 方法的核心是:返回一个**能清晰、简洁、有意义地描述当前对象状态的字符串**,通常包含关键字段值,避免默认的类名+哈希码形式(如 com.example.User@1b6d3586)。
为什么需要重写 toString?
默认实现只返回 getClass().getName() + "@" + Integer.toHexString(hashCode()),对调试、日志、单元测试输出几乎没有可读性。重写后,打印对象或调用 System.out.println(obj) 就能直接看到有用信息。
重写的基本写法(推荐使用 Objects.toString)
用 java.util.Objects.toString() 处理 null 安全,避免 NPE:
@Override
public String toString() {
return "User{" +
"id=" + id +
", name=" + Objects.toString(name, "null") +
", email=" + Objects.toString(email, "null") +
'}';
}
如果字段可能为 null,直接拼接会触发空指针异常;Objects.toString(obj, "default") 在 obj 为 null 时返回指定默认值(如 "null" 或 "")。
立即学习“Java免费学习笔记(深入)”;
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
更规范的做法:用 StringBuilder 或第三方库
字段较多时,用 StringBuilder 提高性能(避免字符串重复创建):
- 手动拼接:适合字段少、控制力强的场景
- 用 Lombok 的
@ToString:编译期自动生成,支持 exclude、include、callSuper 等配置,开发效率高 - 用 Apache Commons Lang 的
ToStringBuilder:支持反射自动遍历、多种风格(JSON、SHORT、MULTI_LINE)
例如 Lombok 示例:
@Data // 自动包含 @ToString
public class User {
private Long id;
private String name;
private String email;
}
编译后自动生成类似上面的手动实现,且天然 null 安全。
注意事项和常见错误
- 不要在
toString()中做耗时操作(如数据库查询、文件读取),它可能被日志框架频繁调用 - 避免循环引用:若对象 A 引用 B,B 又引用 A,重写时未做限制会导致 StackOverflowError
- 不要修改对象状态(即方法必须是纯函数式),否则违反约定,可能引发不可预期行为
- 字段顺序建议与构造参数或业务逻辑重点一致,便于阅读(如先 id,再核心属性)
不复杂但容易忽略。

















