重写 tostring 方法是为了让对象在打印、日志输出或调试时清晰展示关键信息,避免默认的“类名@哈希值”无意义格式;应返回含属性键值对的可读字符串,推荐用 string.format 与 objects.tostring 防 npe,且不可抛异常、泄露敏感信息。

重写 toString 方法是为了让对象在打印、日志输出或调试时,能清晰、可读地展示自身关键信息,而不是默认的类名@哈希值形式(如 Person@1b6d3586)。
为什么需要重写 toString
Java 中所有类都继承自 Object,其默认 toString() 返回的是:getClass().getName() + "@" + Integer.toHexString(hashCode())。这种输出对开发者无实际意义。重写后,可直观看到对象状态,比如:
- 调试时
System.out.println(person)直接输出Person{name='张三', age=25} - 日志框架记录对象时自动调用
toString,内容更易排查 - 单元测试中
assertEquals失败时,错误信息更明确
重写 toString 的基本写法
在类中用 @Override 注解声明方法,返回一个描述对象属性的字符串。推荐格式:类名 + 属性键值对,用花括号包裹,属性间用逗号分隔。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
示例(以 Student 类为例):
public class Student {
private String name;
private int age;
private String id;
// 构造方法、getter 等略
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", id='" + id + '\'' +
'}';
}
}
更安全、更简洁的写法(推荐)
手动拼接容易出错(如漏引号、空指针异常)。建议使用以下方式:
-
用
Objects.toString()处理可能为 null 的字段:避免name.toString()报 NPE -
用
String.format()提升可读性:逻辑清晰,便于维护 - IDE 自动生成(如 IntelliJ:Alt+Insert → “toString()”):支持多种模板,可一键生成并排除某些字段
改进版示例:
@Override
public String toString() {
return String.format("Student{name=%s, age=%d, id=%s}",
Objects.toString(name, "null"),
age,
Objects.toString(id, "null"));
}
注意事项和常见误区
-
不要在
toString中抛异常或执行耗时操作:它可能被日志、调试器频繁调用,影响性能或导致意外崩溃 -
避免包含敏感信息:如密码、token 等字段不应出现在
toString输出中 -
保持一致性:若重写了
equals和hashCode,toString中展示的字段最好与它们判断依据一致 -
子类重写时可复用父类结果:用
super.toString()拼接,避免重复代码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










