重写 toString 方法是为了让对象返回有意义、可读性强、便于调试或日志输出的字符串描述;应只含核心字段、安全处理 null、格式统一为 ClassName[field1=value1, field2=value2],且无副作用。

重写 toString 方法,核心是让对象能返回**有意义、可读性强、便于调试或日志输出的字符串描述**,而不是默认的类名+哈希码形式(如 Person@1b6d3586)。
为什么需要重写 toString?
默认的 Object.toString() 只返回 getClass().getName() + "@" + Integer.toHexString(hashCode()),对业务无实际意义。重写后,打印对象、日志记录、调试时直接看到关键字段值,效率更高、更直观。
怎么安全、规范地重写?
推荐使用以下方式,兼顾可读性、健壮性和维护性:
- 只包含核心业务字段:避免暴露敏感信息(如密码)、大对象(如 byte[])或循环引用字段;
-
处理 null 值:用
Objects.toString(field, "null")或三元表达式,防止空指针; -
格式清晰易读:常用格式为
ClassName[field1=value1, field2=value2]; -
保持一致性:若用了 Lombok,加
@ToString注解即可自动生成(可配置 exclude/include); -
不抛异常、不修改状态:
toString()必须是纯函数式操作,不能有副作用。
一个标准手写示例
假设有一个 Student 类:
立即学习“Java免费学习笔记(深入)”;
public class Student {
private String name;
private Integer age;
private String email;
// 构造器、getter 省略...
@Override
public String toString() {
return "Student[" +
"name=" + Objects.toString(name, "null") + ", " +
"age=" + Objects.toString(age, "null") + ", " +
"email=" + Objects.toString(email, "null") +
"]";
}
}
调用 System.out.println(new Student("张三", 20, null)); 输出:Student[name=张三, age=20, email=null]
进阶建议
- IDE(如 IntelliJ)可一键生成
toString(右键 → Generate → toString),支持多种模板(StringBuilder、Apache Commons Lang 的ToStringBuilder); - 若字段很多或结构复杂,考虑用 JSON 序列化(如 Jackson 的
ObjectMapper.writeValueAsString(this)),但注意性能和循环引用问题; - 单元测试中可简单断言
toString()是否包含预期字段值,提升可维护性。


















