Object.toString()(String) objectString.valueOf(Object)Object object = getObject();
System.out.println(object.toString());
特點:java.lang.Object 定義 public toString(),所有對象可調用。
陷阱:object 必須非 null,否則拋 NullPointerException。
最佳實踐:子類通常覆寫 toString() 返回業務意義字符串。System.out.println(object) 內部自動調用 String.valueOf(),更安全。
Object obj = new Integer(100);
String strVal = (String) obj; // 運行時 ClassCastException!
本質:標準類型轉換,要求對象實際類型為 String 或其子類。
風險:
Object 引用可指向任意對象),運行期才暴露錯誤。Integer 無法轉 String,但 Integer obj = ...; (String) obj 編譯期直接報錯(類型不兼容)。null 可強轉為任何引用類型,(String) null 合法。建議:轉換前用 instanceof 檢查,或避免此用法。
源碼揭秘:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
核心差異:自動處理 null,返回字符串 "null" 而非拋異常。
隱患:String.valueOf(null) == "null"(字符串),而非 null(引用)。
錯誤示例:
if (String.valueOf(object) == null) { ... } // 永遠為 false!
System.out.println(String.valueOf((Object) null)); // 輸出: null
System.out.println((Object) null); // 輸出: null
// 視覺相同,語義截然不同:前者是字符串 "null",後者是 null 引用
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 一般對象轉字符串(含可能為 null) | String.valueOf(obj) | 空安全、語義清晰、性能佳 |
| 確定非 null 對象,需業務定制格式 | obj.toString() | 直接調用覆寫方法 |
| 確知對象就是 String 類型 | (String) obj | 零開銷,但極少見 |
| 打印調試 | System.out.println(obj) | 內部用 valueOf,自動處理 null |
String.valueOf(null) 返回 "null"(長度 4 的字符串),不是 null 引用。String.valueOf((Object) null) 避免歧義,屬良好習慣。toString() 時返回有業務意義的信息(如 "User{id=1, name='Tom'}"),而非默認 ClassName@hashcode。