重写 toString 是为了使对象输出有意义信息而非默认类名加哈希码;应返回简洁、可读、含核心字段的字符串,确保 null 安全、无异常、不依赖外部状态,并推荐用 Objects.toString() 或 Lombok @ToString 实现。

重写 toString 方法是为了让对象在打印、日志输出或调试时显示有意义的信息,而不是默认的类名加哈希码(如 Person@1b6d3586)。关键在于:返回一个**简洁、可读、包含核心字段**的字符串,且不抛异常、不依赖外部状态。
为什么需要重写 toString
Java 中所有类都继承自 Object,其默认 toString() 返回的是:getClass().getName() + "@" + Integer.toHexString(hashCode())。这对调试和日志毫无帮助。重写后,System.out.println(person)、log.info(user)、甚至 IDE 调试窗口都能直接看到有用信息。
怎么正确重写 toString(推荐方式)
使用 Objects.toString() 或 String.format() 处理 null 安全;字段按业务重要性排序;避免换行、特殊符号或大段文本。
- 用
Objects.toString(field, "null")安全处理可能为 null 的字段 - 字段名用小写字母开头,值用双引号包裹(便于区分空字符串和 null)
- 多个字段用逗号+空格分隔,整体用英文括号包围
- 不要在
toString中调用耗时操作(如数据库查询、文件读取)
示例:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
public class User {
private String name;
private Integer age;
private String email;
@Override
public String toString() {
return String.format("User{name='%s', age=%s, email='%s'}",
Objects.toString(name, "null"),
Objects.toString(age, "null"),
Objects.toString(email, "null"));
}
}
更省心的写法:用 Lombok @ToString
如果项目允许引入 Lombok,只需加一个注解,编译时自动注入标准 toString 实现:
@Data // 或单独 @ToString
public class User {
private String name;
private Integer age;
private String email;
}
它默认包含所有非静态字段,自动处理 null,支持排除字段(@ToString(exclude = "password")),也支持自定义格式(需配合 toString() 模板)。
打印对象信息的常见场景与技巧
重写后,以下写法都会触发你的 toString:
System.out.println(obj)-
logger.debug("User: {}", user)(SLF4J / Logback) -
String s = "Info: " + user;(字符串拼接会隐式调用) - IDE 调试时变量视图、表达式求值窗口
注意:单元测试中建议用 assertEquals("expected", obj.toString()) 验证格式;若字段较多,可考虑用 JSON 格式(如 new ObjectMapper().writeValueAsString(obj)),但那是另一层需求,不属于 toString 的职责。


















