toString方法的核心用途是让对象以人类可读字符串形式表达自身状态,用于调试、日志和打印;默认实现返回“类名@哈希值”,需重写为ClassName{field1=value1, field2=value2}格式,避免副作用与耗时操作。
toString 方法的核心用途,是让对象能以人类可读的字符串形式表达自身状态。 它不是用来做数据转换或序列化的,而是为调试、日志、打印和简单展示服务的——当你用 System.out.println(obj) 或拼接字符串(如 "obj: " + obj)时,Java 默认就会调用它的 toString()。
因为所有类都继承自 Object,而 Object.toString() 的默认实现是:getClass().getName() + "@" + Integer.toHexString(hashCode())。比如 Person@1b6d3586。这个结果对开发者几乎没信息量,所以需要重写。
关键原则是:清晰、简洁、包含关键属性,不暴露敏感字段,避免递归调用(比如引用自身或循环引用的对象)。
Alt+Insert → toString)最省事,也符合惯例ClassName{field1=value1, field2=value2},比如 Person{name='张三', age=28}
Objects.toString(field, "null") 防 NPEitems.size=5),避免日志刷屏它不是序列化入口,别在里头写 JSON 生成、文件读写、网络请求等副作用操作;也不适合放复杂逻辑或耗时计算——因为日志、调试器甚至某些框架(如 S
pring Boot Actuator)会在任意时机触发它,性能或稳定性容易出问题。
除了显式调用 obj.toString(),这些地方都会隐式触发:
System.out.println(obj)String.valueOf(obj)"User: " + user
assertEquals(expected, actual))基本上就这些。重写好 toString 是个低成本但高回报的习惯——花一分钟,换来的可能是排查 Bug 时少盯五分钟控制台。