重写 toString 方法是为了让对象打印时清晰展示关键属性而非默认的类名+哈希码。需手动拼接或借助 Lombok、Apache Commons、Guava 等工具,注意 null 安全、性能、循环引用和敏感字段过滤。

重写 toString 方法,核心是让对象打印时能清晰、简洁地展示关键属性,而不是默认的类名+哈希码形式。
为什么需要重写 toString
Java 中所有类都继承自 Object,其默认 toString() 返回类似 ClassName@hashcode 的字符串(如 Person@1b6d3586),对调试和日志毫无帮助。重写后可直观看到对象状态,提升开发效率。
基本写法:手动拼接字符串
在类中用 @Override 注解覆盖方法,返回格式化的字符串:
- 推荐用字段名 + 值的形式,如
"Person{name='张三', age=25}" - 注意 null 安全:用
Objects.toString(field, "null")或三元判断避免空指针 - 避免直接调用可能抛异常的 getter(除非确定安全)
示例:
立即学习“Java免费学习笔记(深入)”;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", email=" + Objects.toString(email, "null") +
'}';
}
更规范的做法:用工具类或 Lombok
手写易出错且维护成本高,推荐以下方式:
-
Apache Commons Lang3:用
ToStringBuilder.reflectionToString(this),自动遍历所有字段(需引入依赖) -
Google Guava:用
MoreObjects.toStringHelper(this).add("name", name).add("age", age).toString(),链式构建,类型安全 -
Lombok:加
@ToString注解,编译期生成;支持排除字段(@ToString(exclude = "password"))、调用 getter(callSuper = true)等
注意事项和常见坑
重写时需留意这些细节:
- 不要在
toString()中做耗时操作(如数据库查询、文件读取),它可能被日志框架频繁调用 - 避免循环引用导致栈溢出(如 A 包含 B,B 又引用 A),可用
@ToString.Exclude或手动控制输出 - 敏感字段(密码、token)务必过滤,不参与 toString 输出
- 若类有继承关系,子类重写时建议调用
super.toString()并追加自身字段


















