重写 toString() 方法是为了让对象打印时清晰展示自身状态而非默认的类名加哈希码;需避免字符串拼接,推荐用 String.format 或 Objects.toString() 处理 null;应简洁可读、不抛异常、不泄露敏感信息。

重写 toString() 方法是为了让对象在打印或调试时能清晰展示自身状态,而不是默认的类名加哈希码(如 Person@1b6d3586)。
为什么需要重写 toString
Java 中所有类都继承自 Object,其默认 toString() 只返回 getClass().getName() + "@" + Integer.toHexString(hashCode()),对理解对象内容毫无帮助。重写后可直观看到字段值,便于日志输出、调试和单元测试断言。
基本重写写法(推荐用 StringBuilder 或 String.format)
避免字符串拼接("name=" + name + ", age=" + age),尤其字段多或可能为 null 时易出错。建议用 String.format 或 Objects.toString() 处理空值:
- 使用
String.format:简洁、可读性好,适合固定格式 - 使用
java.util.Objects.toString(obj, "null")安全处理null - IDE(如 IntelliJ IDEA)通常支持快捷生成(Alt+Insert → “Generate” → “toString”),会自动处理
null和格式
示例代码(含 null 安全处理)
假设有一个 Person 类:
public class Person {
private String name;
private Integer age; // 可能为 null
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return String.format("Person{name='%s', age=%s}",
Objects.toString(name, "null"),
Objects.toString(age, "null"));
}
}
这样即使 name 或 age 为 null,也不会抛出异常,输出类似:Person{name='Alice', age=null}。
注意事项
重写 toString() 不影响业务逻辑,但应遵守几个隐含约定:
- 返回值应是简洁、可读的字符串,不含换行或控制字符
- 不要在其中调用可能阻塞或抛异常的方法(如 I/O、远程调用)
- 若类有敏感字段(如密码),不应直接输出,可写成
password= - 如果用 Lombok,加
@ToString注解即可自动生成(支持 exclude、include、callSuper 等选项)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











