java中为何任何对象都可以和String进行拼接?

问题引入

在学习java-se中偶然对以下代码产生了兴趣,如下:

1
2
3
4
 String s ="hello" + 123 + true + 1.32;
System.out.println("拼接后的String为:" + s);

//out:拼接后的String为:hello123true1.32

由上可知,任何变量(不管是基本数据类型,还是引用数据类型)都可以自动向String进行转换,以完成最后的拼接。那么,这背后的操作是如何实现的呢?

原理剖析

引用数据类型向String的转换

引用数据类型,也就是我们常说的类类型,在java中都共同拥有一个顶层父类Object,而在这个Object类中,我们可以发现这样一个方法toString(),其源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Returns a string representation of the object. In general, the
* {@code toString} method returns a string that
* "textually represents" this object. The result should
* be a concise but informative representation that is easy for a
* person to read.
* It is recommended that all subclasses override this method.
* <p>
* The {@code toString} method for class {@code Object}
* returns a string consisting of the name of the class of which the
* object is an instance, the at-sign character `{@code @}', and
* the unsigned hexadecimal representation of the hash code of the
* object. In other words, this method returns a string equal to the
* value of:
* <blockquote>
* <pre>
* getClass().getName() + '@' + Integer.toHexString(hashCode())
* </pre></blockquote>
*
* @return a string representation of the object.
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

通过阅读方法注释,我们不难知道:这个方法是用来输出一个object对象的。所有Java类都是object类的子类,因此所有Java对象都具有toString方法。

不仅如此,所有Java对象都可以和字符串进行连接运算,当Java对象和字符串进行连接运算时,系统自动调用Java对象toString()方法,返回值和字符串进行连接运算。

基本数据类型向String的转换

首先,我们知道在Java中,一切皆对象,但八大基本类型却不是对象。通过上述分析,我们可以解释对象通过toString()转换为字符串后与String对象完成拼接,那么基本数据类型又是如何完成这一过程的呢?

要解释这一问题,就要涉及java中基本数据类型的自动装箱技术。

所谓装箱,就是把基本类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double,等等。

J2SE5.0后提供了自动装箱与拆箱的功能,此功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的方法,决定是否进行装箱或拆箱动作

自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。

通过自动装箱,我们就可以很好的解释为什么基本数据类型intfloat等能够完成向String的转换与拼接。整个过程就是,编译器检测到我们需要进行int与字符串的拼接,首先自动帮我们将int自动装箱成Integer对象,然后Integer对象调用自身的toString()方法转为字符串,最终完成拼接工作。

参考文章


Java 包装类 拆箱 装箱

java打印对象和toString方法