關於String類之toString()方法的細節
阿新 • • 發佈:2019-01-22
Object是所有類的父類,編譯器在編譯我們的自定義類檔案時,會自動將Object類加入到我們的class檔案中,toString()是定義在Object中的一個方法,String類是Object的子類,String類重寫了這個方法,看java原始碼:
同樣StringBuilder類中也重寫了toString()方法:
原始碼中new了一個String物件,實則是呼叫了String物件的toString的方法。
例:
public class StringBuilderTest { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append("It's a beautiful night!"); sb.append("so cool."); System.out.println(sb); //It's a beautiful night!so cool. } }
前面都是前奏,下面主角登場了:
使用javac編譯上面這個類檔案,出現如下錯誤:class Fruit<T> //filename Apple.java 此例來自李剛老師的《瘋狂java講義》一書 { private T info; public Fruit(){} public Fruit(T info) { this.info = info; } public T getInfo() { return info; } } public class Apple extends Fruit { //override public Apple(String name) { super(name); } public String getInfo() { //獲取其執行時型別 //System.out.println(super.getInfo().getClass()); 為java.lang.String return super.getInfo(); } public static void main(String[] args) { Apple a = new Apple("banana"); System.out.println(a.getInfo()); } }
解釋:在使用Apple類時,沒有傳入實際的型別引數,編譯器發出了警告:unchecked or unsafe operation。同時產生了一個錯誤:Object
cannot be convered to String,因為在繼承時沒有像這樣(public class Apple extends Fruit<String>{})傳入實際的型別引數,編譯器在做型別檢測時,程式碼super.getInfo()返回的是Object型別,而在Apple類中的getInfo()方法的返回值是String型別的,Object是不能轉型為String型別的(可以自動向上轉型,但不能自動向下轉型,除非強制型別轉換),所以出現了錯誤。將上面程式碼中的super.getInfo()改為:
return super.getInfo().toString();
使用toString()方法後,就能通過編譯器的型別檢測了,super.getInfo()在編譯時是一個Object型別的,執行時是String型別的(多型),然後呼叫String類重寫父類的toString()方法,得到了字串"banana"並將其返回,得到最終的列印結果。
OL