首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入理解 Java Object.toString():默認實現、重寫技巧與反射原理

     編輯:Java 相關知識

默認行為解析

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

為什麼要重寫 toString()?

默認輸出對業務無意義。重寫後可輸出關鍵屬性,極大提升調試、日誌、異常排查效率。

@Override
public String toString() {
    return "User{id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
}
// 輸出:User{id=1, name='張三', age=25}

重寫最佳實踐

  1. 包含所有關鍵業務字段,忽略敏感信息(密碼、Token)。
  2. 格式統一:推薦 ClassName{field=value, ...} 風格。
  3. 處理 null:用 Objects.toString(field) 或 field == null ? "null" : field。
  4. 避免循環引用:雙向關聯對象用 @ToString.Exclude(Lombok)或手動截斷。
  5. 性能考量:高頻調用場景可緩存或用 StringBuilder。

工具類加持

1. Apache Commons Lang

ToStringBuilder.reflectionToString(obj, ToStringStyle.SHORT_PREFIX_STYLE);
// 自動反射所有字段,含繼承鏈

2. Lombok

@Data // 含 @ToString
@ToString(exclude = "password") // 排除敏感字段
public class User { ... }

3. Java 9+ Objects.toString()

Objects.toString(obj, "null"); // null 安全

反射視角理解 toString()

對象創建時生成 .class 文件,JVM 用 Class 對象描述類元數據:

Class<?> clazz = obj.getClass();
String className = clazz.getName(); // 類全名
// 結合 hashCode() 即可手動構建默認 toString()

這也是各類 ToStringBuilder 實現的核心原理:反射遍歷字段 → 構建字符串。

常見面試題

  1. toString()、equals()、hashCode() 三者關系? 重寫 equals() 必須重寫 hashCode();toString() 獨立,但建議三者一起重寫形成完整值對象語義。
  2. 打印數組直接輸出什麼? [I@hashcode,需用 Arrays.toString() 或 Arrays.deepToString()。
  3. 日誌框架如何打印對象? SLF4J/Log4j2 會自動調用 toString();若對象為 null,輸出 "null"。

總結

toString() 是對象的「身份證」。默認實現僅供 JVM 內部標識,業務代碼必須重寫。善用 Lombok/Commons Lang 工具,配合代碼規範,讓每個對象都能「說人話」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved