當我們執行 System.out.println(obj) 時,若 obj 是自訂類別實例,控制台常輸出類似 test.A@15093f1 的字串。這是因為 Object 類別預設的 toString() 實作為:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
這顯然不是我們想要的業務資料輸出。
只需在類別中 @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
}
}
// 若欄位可能為 null
return "A{a=" + a + ", b=" + b + "}";
可選擇包含哪些欄位、格式樣板 (如 JSON、CSV、多行)。
// 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();
}
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 開發者的基本素養。