java中object类tostring()默认格式为“类全名@哈希码(十六进制)”,其中类全名通过getclass().getname()获取含包路径,@是硬编码分隔符,哈希码由hashcode()转十六进制而来,设计目的是提供轻量、安全的对象身份标识。

Java中 Object 类的 toString() 方法默认输出格式是:类全名@哈希码(十六进制),比如 com.example.Person@1b6d3586。它不反映对象内容,只提供一种“身份标识”,主要用于底层识别,而非业务展示。
类全名部分怎么来的
调用 getClass().getName() 获取,包含完整包路径。例如在 cn.myapp.User 包下的 User 类,就显示为 cn.myapp.User,不是简单写 User。
- 如果类是匿名内部类,会显示类似
com.example.Main$1的名称 - 数组类型会特殊处理:
int[].class.getName()返回[I,String[].class.getName()返回[Ljava.lang.String;
@ 符号只是分隔符,没有特殊含义
它纯粹是硬编码的字符,源码里就是 "@" 字符串拼接,既不代表地址,也不表示引用关系,仅起视觉区隔作用。
- 这个符号不可配置,也不能省略或替换
- 和邮箱、URL 中的 @ 没有任何语义关联
哈希码是整数,但显示为十六进制字符串
调用 hashCode() 得到一个 int 值,再用 Integer.toHexString() 转成小写十六进制形式(不含前缀 0x)。注意:
- 该哈希码通常基于对象内存地址生成,但不是地址本身;JVM 实现可能不同,比如某些版本使用随机数
- 同一对象多次调用
hashCode()返回值一致,但不同对象可能偶然相同(哈希碰撞) - 若重写了
hashCode(),toString()显示的哈希码也会随之变化
为什么这样设计
Object 的默认 toString() 本质是“最小可行标识”——在完全不了解子类结构的前提下,至少能区分两个不同对象(哪怕字段全一样)。
- 调试时可快速判断是否为同一实例(配合 IDE 断点观察)
- 避免空指针或字段未初始化导致的异常(不用访问任何成员变量)
- 保持轻量:无需反射、不依赖字段可见性,所有对象开箱即用
实际开发中,只要对象有业务属性,就应该重写 toString(),否则日志和调试信息几乎无法解读。不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











