1. 程式人生 > >關於String類之toString()方法的細節

關於String類之toString()方法的細節

    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.
	}
}

前面都是前奏,下面主角登場了:

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());
	}
}
    使用javac編譯上面這個類檔案,出現如下錯誤:


    解釋:在使用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大笑