println()方法爲什麼會輸出hashcode?

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

第一篇博客,如有錯誤歡迎大家指出,請多多指教。

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