轉自https://www.cnblogs.com/yuxiaoqi/p/3562161.html
簡述
在Java中,往往需要把一個類型的變量轉換成String 類型。作為菜鳥,有時候我會使用(String) data,有時候就使用data.toString(),如果不行還會試試 String.valueOf(data),但始終不是很清楚它們有什么不同。前幾天在coding,由於是用gwt-ext編寫界面的時候出現了轉型錯誤,所以也沒有提示java.lang.ClassCastException的異常,只是提示gwt exception thrown and not caught。找了半天才發現原來是因為這個,現特記錄一下,以后碰到了也就更清楚些。
看完簡述,如果你已完全了解就可以走了,如果也是不太懂可以看看,如果有不對的地方還可以討論。這也算是開頭加上個簡述的作用,就是已經了解的人不必重復花時間看了。
toString()方法
先看API 中關於 toString()的描述:
返回該對象的字符串表示。通常,
toString
方法會返回一個“以文本方式表示”此對象的字符串。結果應是一個簡明但易於讀懂的信息表達式。建議所有子類都重寫此方法。
Object
類的toString
方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符“@
”和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等於:getClass().getName() + '@' + Integer.toHexString(hashCode())
toString()方法返回的是這個對象的字符串表示,就像是這個對象的名字一樣,任何對象都可以有自己的名字,你可以重寫其toString()方法,給其賦予任意的名字。
但是調用toString()方法的對象不能為 null,否則會拋出異常:java.lang.NullPointerException。
String.valueOf()方法
上邊提到,調用toString()方法的對象不能是null,但接下來這個 String.valueOf()方法卻不管這些,其實這個方法也是調用了toString()方法,只不過在調用之前做了點處理,我們來看一下源碼:
/** * Returns the string representation of the <code>Object</code> argument. * * @param obj an <code>Object</code>. * @return if the argument is <code>null</code>, then a string equal to * <code>"null"</code>; otherwise, the value of * <code>obj.toString()</code> is returned. * @see java.lang.Object#toString() */ public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
不看注釋,直接看代碼也知道,這個方法就是在調用 toString() 之前判斷一下這個對象是不是null,如果不是null,則正常調用其toString()方法,如果是null 的話,則返回字符串形式的null。
String.valueOf() 比起直接用 toString() 來說雖然可能會減少報錯的機會,但是如果在對比對象值的時候可要小心,要注意如果用if(String.valueOf(object)==null) 就肯定不行的了。
強制轉換 (String)data
這個是初學者最容易出錯的,其實每個對象的類型在對象創建的時候已經確定並且不能更改,所謂強制轉換也只是使其表面上換成了另一種類型,可以使用其方法對這個對象進行處理。那么可想而知,把物品A 當成物品B 來使用,當A 能能夠被當成 B的時候大家都相安無事,你走你的路,我過我的橋,一旦A 不能被當成B ,它不會去自動調用 toString()方法,而是馬上就會報錯。
例一:
Integer obj1 = new Integer(100); String strVal = (String)obj1; //Cannot cast from Integer to String
因為obj1 在創建的時候就是 Integer 類型,不能轉換成 String 類型,所以在編譯期間就會報錯Cannot cast from Integer to String。
例二:
Object obj2 = new Integer(100); String strVal = (String)obj2;
obj2 雖然本質上是 Integer 類型,但其表面上確是 Object 類型,所以在編譯的時候沒有報錯,但因為 obj2 在創建的時候已經確定了其在本質上 Integer 類型,所以這兩行代碼在運行時依然會報錯,因為 Integer 型不能轉換成 String 類型。
當然,如果要把 Integer 型轉換成 String,可以調用其 toString()方法:Integer.toString(obj1) 或者 String.valueOf(obj1); 對應於其他自定義類型,則調用自己重寫的 toString() 方法。
此外,因null值可以被強制轉換為任何類型,所以(String)null也是合法的。