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;
}
由上述代碼可知,結論正確.