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

第一篇博客,如有错误欢迎大家指出,请多多指教。

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