必须重写 toString 方法,因为默认 Object.toString() 仅返回“类名@哈希码”,无法反映对象真实状态;应包含业务核心字段、采用“类名{字段=值}”格式、安全处理 null,并推荐用 IDE 自动生成或 Lombok @ToString 简化维护。

重写 toString 方法是 Java 面向对象开发中为实体类提供可读、一致调试信息的最直接方式。它不改变业务逻辑,但极大提升日志输出、调试打印和单元测试断言的可读性与可靠性。
为什么必须重写 toString?
默认的 Object.toString() 只返回 类名@哈希码(如 User@1b6d3586),无法反映对象真实状态。调试时看到这种输出,既不能确认字段值,也无法快速比对两个对象是否逻辑相等。
重写的规范写法(推荐使用 IDE 自动生成)
手动拼接字符串易出错、难维护;应优先用 IDE(如 IntelliJ IDEA 或 Eclipse)自动生成,或借助 Objects.toString()、String.format() 等工具保证健壮性。关键点:
- 包含所有**业务相关核心字段**(排除敏感字段如密码、token)
- 格式清晰:建议用
类名{字段1=值1, 字段2=值2}结构 - 处理
null:避免NullPointerException,可用Objects.toString(field, "null") - 避免调用可能抛异常或耗时的方法(如数据库查询、远程调用)
示例:一个安全、可读的 toString 实现
假设有一个 User 实体类:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class User {
private Long id;
private String name;
private Integer age;
private String email;
// 构造器、getter、setter 略
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
}
更健壮的写法(兼容 null):
@Override
public String toString() {
return String.format("User{id=%s, name=%s, age=%s, email=%s}",
id,
Objects.toString(name, "null"),
age,
Objects.toString(email, "null"));
}
进阶建议:配合 Lombok 简化维护
项目引入 Lombok 后,只需加 @ToString 注解,自动完成安全、可配置的 toString 生成:
@Data
@ToString(exclude = "password") // 排除敏感字段
public class User {
private Long id;
private String name;
private Integer age;
private String email;
private String password; // 不出现在 toString 中
}
编译后会自动生成符合规范的 toString,且支持排除字段、只包含指定字段等灵活配置。
不复杂但容易忽略——一个干净的 toString 是团队协作和问题定位的第一道友好防线。

















