Object.toString() 默認返回:類全限定名@十六進制哈希碼,例如 ObjectDemo@26f04d94。
hashCode():返回對象哈希碼(默認基於內存地址)Integer.toHexString(hashCode()):轉為十六進制字符串getClass().getName():獲取類全名ObjectDemo od = new ObjectDemo();
System.out.println(od.toString()); // ObjectDemo@26f04d94
System.out.println(Integer.toHexString(od.hashCode())); // 26f04d94
System.out.println(od.getClass().getName() + "@" + Integer.toHexString(od.hashCode()));
// 同樣輸出 ObjectDemo@26f04d94
默認輸出對業務無意義。重寫後可輸出關鍵屬性,極大提升調試、日誌、異常排查效率。
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
}
// 輸出:User{id=1, name='張三', age=25}
ClassName{field=value, ...} 風格。Objects.toString(field) 或 field == null ? "null" : field。@ToString.Exclude(Lombok)或手動截斷。StringBuilder。ToStringBuilder.reflectionToString(obj, ToStringStyle.SHORT_PREFIX_STYLE);
// 自動反射所有字段,含繼承鏈
@Data // 含 @ToString
@ToString(exclude = "password") // 排除敏感字段
public class User { ... }
Objects.toString(obj, "null"); // null 安全
對象創建時生成 .class 文件,JVM 用 Class 對象描述類元數據:
Class<?> clazz = obj.getClass();
String className = clazz.getName(); // 類全名
// 結合 hashCode() 即可手動構建默認 toString()
這也是各類 ToStringBuilder 實現的核心原理:反射遍歷字段 → 構建字符串。
[I@hashcode,需用 Arrays.toString() 或 Arrays.deepToString()。toString();若對象為 null,輸出 "null"。toString() 是對象的「身份證」。默認實現僅供 JVM 內部標識,業務代碼必須重寫。善用 Lombok/Commons Lang 工具,配合代碼規範,讓每個對象都能「說人話」。