調用鏈路
System.out.print(obj)
→ PrintStream.print(Object)
→ String.valueOf(obj)
→ obj.toString() // 動態綁定:調用對象實際類型的 toString()
多態表現
- 未重寫 toString:調用
Object.toString() → 輸出 類名@哈希碼(如 User@1a2b3c4d)。
- 重寫 toString:調用子類實現 → 輸出業務含義字符串(如
User{name='Tom', age=20})。
- 基本類型:
int i=1; print(i) → 裝箱為 Integer → Integer.toString() → "1"。
隱式調用場景
| 代碼 | 實際調用 |
| System.out.println(obj) | obj.toString() |
| String s = "msg: " + obj | obj.toString() |
| log.debug("obj={}", obj) | obj.toString() (SLF4J 佔位符) |
| assertEquals(expected, actual) | actual.toString() (失敗時打印) |
最佳實踐
- 所有實體類/DTO 必須重寫 toString(IDE 自動生成或 Lombok
@ToString)。
- 包含所有關鍵字段,格式統一,便於日誌排查。
- 避免在 toString 中觸發懶加載/數據庫查詢,防止性能問題。