關於System.out.println(str)打印的是字符串值,而不是地址的問題

Q:爲什麼會有這種問題呢?
A:在我們沒有學習Object類的toString方法前,我們打印引用類型對象名,打印出來的是地址值,那麼String作爲引用類型,打印的應該也是地址值呀.爲什麼它打印出來的就是字符串本身的值呢.


代碼舉例:

String str = "abc";
System.out.println(str);

輸出結果:abc


原因:

我們首先要記住一個概念:在打印引用類型對象名的時候,默認調用toString方法.String類作爲Object的子類,必然也繼承了toString方法,所以上面第2行代碼實際爲:System.out.println(str.toString());toString方法的意義是獲取對象的文本描述.所以在java內部,String類重寫了Object類的toString方法,使其打印str所指向的內存裏共享區 串池中的一串字符(abc).


結論:

不論是那種引用類型,直接打印對象名的時候,默認調用toString方法.如果此類沒有重寫Object類中的toString方法,那麼就調用Object類的toString方法,即打印出來的是地址(全類名+@+16進制的hashCode).如果此類重寫了toString方法,那麼就打印重寫的toString方法.


利用代碼來驗證結論:

public class Test {

	public static void main(String[] args) {
		TestA a = new TestA();//利用無參構造創造對象a
		TestB b = new TestB();//創建對象b
		System.out.println(a);//結果:TestA [i=1]
		System.out.println(b);//結果:demo2.TestB@15db9742
	//由結果證明打印的實際是對象.toString()
	//對象a重寫了,所以打印重寫的.
	//對象b沒有重寫,所以打印地址
	}
}
//TestA有對toString的重寫
class TestA{
	int i = 1;

	@Override
	public String toString() {
		return "TestA [i=" + i + "]";
	}

}
//TestB沒有對toString的重寫
class TestB{
	int j = 2;
}

由上述代碼可知,結論正確.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章