Java中toString方法的作用是将对象关键属性以清晰可读的字符串形式表达,需手动重写Object.toString(),避免默认的ClassName@hashcode格式;应包含业务相关、非敏感、非null必现字段,按逻辑顺序组织,妥善处理null值,并避免异常、耗时操作及循环引用。

Java中toString方法的作用,就是把对象的属性以字符串形式清晰、可读地表达出来。它不是自动帮你拼接字段,而是需要你手动重写(覆盖)Object.toString(),把关键属性组织成有意义的文本。
为什么要重写 toString?
默认的Object.toString()只返回类似ClassName@hashcode的字符串(如Person@1b6d3586),对调试和日志毫无帮助。重写后,打印对象或日志输出时就能直接看到“人名:张三,年龄:28,城市:北京”这类信息。
怎么正确重写 toString 方法?
在类里用@Override标注,返回一个包含核心属性的格式化字符串。建议遵循几个实用原则:
- 只包含业务相关、非敏感、非null必现的字段(比如不放密码、不放未初始化的集合)
- 字段顺序保持逻辑性(如先ID再姓名再状态)
- 用逗号分隔或换行,避免无分隔符导致歧义(
name:zhangsanage:28难读) - 对可能为null的字段做判空处理,避免
NullPointerException
示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + (name != null ? name : "null") + '\'' +
", email='" + (email != null ? email : "null") + '\'' +
", isActive=" + isActive +
'}';
}
推荐用工具类简化编写
手写容易出错且维护成本高。常用方案有:
-
Lombok:加
@ToString注解,自动根据所有非静态字段生成;支持exclude排除敏感字段,includeFieldNames = true控制是否带字段名 -
Apache Commons Lang:用
ToStringBuilder.reflectionToString(this),基于反射一键生成(适合临时调试) - IDE快捷生成:IntelliJ IDEA 或 Eclipse 都支持右键 → Generate → toString,选择字段后自动生成标准格式
注意事项和常见坑
重写toString看似简单,但几个细节影响体验:
- 不要在 toString 里调用可能抛异常或耗时的方法(比如远程查询、文件读取),它可能被日志框架频繁调用
-
避免循环引用:如果A对象引用B,B又引用A,重写时没控制会栈溢出。可用
ToStringBuilder.appendAsObjectToString或手动跳过关联对象 -
线程安全不用考虑:
toString是纯读操作,只要字段本身不变,就无需同步 -
JSON序列化别依赖它:它面向人类阅读,不是标准数据格式;要用
ObjectMapper或Gson转JSON

















