重写 toString() 是为了让对象打印时显示关键字段而非默认的类名+哈希值;应使用 String.format 或 StringBuilder 提升可读性与性能,配合 Objects.toString() 处理 null,并借助 IDE 自动生成以确保规范与安全。

在 Java 类中重写 toString() 方法,是为了让对象在打印、调试或日志输出时能清晰展示关键字段信息,而不是默认的类名+哈希值(如 Person@1b6d3586)。
为什么要重写 toString
默认的 Object.toString() 只返回 getClass().getName() + "@" + Integer.toHexString(hashCode()),对理解对象状态毫无帮助。重写后,可以直观看到对象的实际数据,尤其在开发调试、单元测试断言、日志记录时非常实用。
基本写法(推荐用 StringBuilder 或 String.format)
避免字符串拼接(+)在循环或大量字段时性能差;建议用 StringBuilder 或 String.format 提高可读性和效率:
- 用
StringBuilder:适合字段较多、需控制格式的场景 - 用
String.format:简洁清晰,适合中等字段数(如 3–8 个) - 避免直接用
+拼接多个字段(编译器虽会优化,但可读性差)
示例(使用 String.format):
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class User {
private String name;
private int age;
private String email;
// 构造方法、getter 省略...
@Override
public String toString() {
return String.format("User{name='%s', age=%d, email='%s'}",
name, age, email);
}
}
处理 null 和复杂字段的技巧
字段可能为 null,或包含集合、嵌套对象,直接调用 toString() 可能抛 NullPointerException 或输出不友好:
- 用
Objects.toString(obj, "null")安全转换(推荐,来自java.util.Objects) - 对集合字段,用
Arrays.toString()或list.toString()(本身已重写) - 嵌套对象也应已重写
toString(),否则手动提取关键字段
示例(含 null 安全):
import java.util.Objects;
public class Order {
private String orderId;
private User customer;
private List<Item> items;
@Override
public String toString() {
return String.format("Order{orderId='%s', customer=%s, items=%s}",
orderId,
Objects.toString(customer, "null"),
Objects.toString(items, "[]"));
}
}
IDE 自动生成(快速又规范)
IntelliJ IDEA 和 Eclipse 都支持一键生成 toString(),且默认使用 StringBuilder 或 Objects.toString,避免手误:
- IntelliJ:右键 → Generate → toString() → 勾选需要的字段
- Eclipse:右键 → Source → Generate toString()
- 生成结果通常包含 null 安全处理和合理缩进,可直接使用
生成后建议检查是否遗漏重要字段,或是否需对敏感字段(如密码)做脱敏(例如显示为 "***")。

















