println()方法爲什麼會輸出hashcode?
本篇文章將瞭解:println()方法的源碼,String.valueOf()方法的重載,toString()方法的源碼。
首先我們要知道,任何類的都繼承自Object類,也就都集成了Object類中的toString()方法。
那麼println()這個方法是如何調用toString()方法的呢?
大概流程如下:
1.我們先看println()這個方法的源碼是如何寫的。
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
以上源碼可以看出,println()接收的x對象傳給了String.valueOf()這個方法。
2.而String.valueOf()這個方法的源碼又是怎麼寫的呢?
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
這裏相當於調用obj.toString()這個方法。
由於所有的java對象都派生自Object,如果沒有對該方法做重寫
則會調用父類的方法super.toString().
3.那麼toString()方法是如何發送hashcode的呢?
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
在這裏我們就可以名明顯的看出來了,此處的toString方法會返回結果爲 “classname + @ + hashcode” 的字符串。
思考1:以下代碼會輸出啥呢?
char[] arr1 = new char[]{'a', 'b', 'c'};
System.out.println(arr1);
char[] arr2 = new char[]{'a', 'b', 'c'};
System.out.println("a: " + arr2);
輸出結果:
abc
a: [C@15db9742
wdnmd,爲什麼System.out.println("a: " + arr2);
輸出的結果是hashcode?
這是因爲println()這個方法的重載。
在Java API文檔中我們可以看到println()這個方法的重載接收的參數類型。System.out.println("" + arr2);
由於"" + arr2
這裏進行了字符串的拼接操作,所以系統並沒有調用接收char[ ]類對象的println(char[] x)
這個方法,此時println()方法接收的是String類的對象。
而根據上述的步驟,最後會調用String.valueOf(Object obj)
,
所以最後輸出爲:a: [C@15db9742
思考2:以下代碼會輸出啥呢?
int[] i = new int[]{1, 2, 3};
System.out.println(i);
輸出結果:
[I@6d06d69c
有了思考1的思路,這個就相對簡單得多了。
因爲println()這個方法的重載,並沒有重載接收的int[ ]類對象的,參數類型的方法。
又因爲所有類都繼承自Object這個父類,int[ ]類也不意外。
所以,最後這裏調用的也是String.valueOf(Object obj)
這個方法,輸出了hashcode值。
思考3:重寫toString()方法的必要性。
有時候我們想使用println(對象名)這個方法,直接輸出自定義類裏面的值該怎麼做呢?
通過上面的認識,現在我們知道可以重寫toString()這個方法。
class A {
private String a;
public A(String a) {
this.a = a;
}
public String toString() {
return this.a;
}
}
class B {
}
public class TestToString {
public static void main(String[] args) {
A aa = new A("abc");
B bb = new B();
System.out.println(aa);
System.out.println(bb);
}
}
輸出結果:
abc
B@7852e922
參考文章:
https://www.cnblogs.com/1446358788-qq/p/4796446.html
https://blog.csdn.net/xv1356027897/article/details/79518254
https://bbs.csdn.net/topics/270058859
第一篇博客,如有錯誤歡迎大家指出,請多多指教。