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

Java 物件轉字串:重寫 toString() 完全指南

     編輯:Java 程式設計入門

現象:直接列印物件為何輸出亂碼?

當我們執行 System.out.println(obj) 時,若 obj 是自訂類別實例,控制台常輸出類似 test.A@15093f1 的字串。這是因為 Object 類別預設的 toString() 實作為:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

這顯然不是我們想要的業務資料輸出。

解決方案:覆寫 toString() 方法

只需在類別中 @Override 實作 toString(),即可自訂輸出格式。

修改前:

class A {
    int a, b;
    // getter/setter 省略
}

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.setA(8); a.setB(9);
        System.out.println(a); // 輸出: test.A@15093f1
    }
}

修改後:

class A {
    int a, b;
    // getter/setter 省略

    @Override
    public String toString() {
        return "A.a:" + a + "; A.b:" + b;
    }
}

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.setA(8); a.setB(9);
        System.out.println(a); // 輸出: A.a:8; A.b:9
    }
}

進階技巧與最佳實踐

1. 使用 Objects.toString() (Java 7+) 避免 NPE

// 若欄位可能為 null
return "A{a=" + a + ", b=" + b + "}";

2. 利用 IDE 自動產生 (IntelliJ: Alt+Insert → toString())

可選擇包含哪些欄位、格式樣板 (如 JSON、CSV、多行)。

3. Apache Commons Lang / Guava 輔助

// Commons Lang
@Override public String toString() {
    return ToStringBuilder.reflectionToString(this);
}

// Guava
@Override public String toString() {
    return MoreObjects.toStringHelper(this)
        .add("a", a).add("b", b).toString();
}

4. Record 類別 (Java 16+) 自動實作

public record Point(int x, int y) {}
// 自動擁有 toString(): Point[x=1, y=2]

常見誤區

  • 只在開發時用: toString() 也常用於生產環境日誌、除錯、序列化,請務必保持資訊完整且可讀。
  • 效能考量: 避免在 toString() 中進行重運算或 I/O,若物件極大可考慮摘要模式。
  • 避免循環引用: 雙向關聯物件互相 toString() 會導致堆疊溢位,需手動斷開或使用 @ToString.Exclude (Lombok)。

總結

toString() 是 Java 物件「自我描述」的標準契約。養成**為所有實體類別覆寫 toString()** 的習慣,能大幅提升除錯效率與日誌可讀性,是專業 Java 開發者的基本素養。

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