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

Java toString() 方法深度解析:從 Object 到 String 的重寫之路

     編輯:Java 相關知識

前言

toString() 是 Java 開發中最高頻呼叫的方法之一,但許多開發者僅知其表不知其理。本文從 JDK 原始碼出發,層層剖析 Object、String、CharSequence 的實現差異,並示範正確重寫姿勢。

Object.toString():預設行為

public String toString() {
    return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
  • 回傳:類全名@哈希碼(16進位),例如 com.example.User@1a2b3c4d
  • 用途:提供物件唯一標識,但無業務可讀性
  • 建議:所有子類都應重寫toString()

String.toString():特例

public String toString() {
    return this; // 已經是字串,直接回傳自身
}
  • 繼承 Object 並實作 CharSequence
  • 重寫目的:避免產生 String@hash 這類無意義輸出
  • 回傳:字串內容本身

CharSequence.toString():介面契約

String toString(); // 回傳包含此序列字元的字串,長度相同
  • 定義:將字元序列轉為 String
  • String、StringBuilder、StringBuffer 皆實作此介面
  • 語意:內容相等,而非 Object 的身分標識

實戰:正確重寫 toString()

錯誤示範

public class User {
    private String name;
    private int age;
    // 未重寫 toString()
}
User u = new User(); u.setName("Tom"); u.setAge(20);
System.out.println(u); // 輸出:User@15db9742 ❌

標準重寫(IDE 自動產生)

@Override
public String toString() {
    return "User{name='" + name + "', age=" + age + '}';
}
// 輸出:User{name='Tom', age=20} ✅

進階:使用 Objects.toString() (Java 7+) 或 Apache Commons Lang

// Java 7+ 標準庫
@Override
public String toString() {
    return Objects.toStringHelper(this)
        .add("name", name)
        .add("age", age)
        .toString();
}

// Apache Commons Lang 3
@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}

最佳實踐檢查清單

  1. 必須重寫:所有實體類、DTO、VO、例外類
  2. 包含關鍵業務欄位:ID、名稱、狀態等,避免巨大物件圖導致效能/堆疊溢位
  3. 格式一致:團隊統一風格(如 ClassName{field=value,...})
  4. 不拋出異常:toString() 應為純計算、無副作用
  5. 考慮敏感資料:密碼、Token 等以 ****** 掩碼

常見誤區

誤區正確觀念
只在除錯用,不重要日誌、監控、序列化、單元測試斷言皆依賴它
直接印陣列/集合陣列未重寫 toString(),需用 Arrays.toString()/List.toString()
重寫後格式隨意統一格式利於日誌分析工具解析

結語

toString() 是物件的「名片」,良好的實作能大幅提升除錯效率、日誌可讀性與系統可觀測性。養成「建立類即重寫 toString()」的習慣,是專業 Java 開發者的基本素養。

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