问题引入
在学习java-se中偶然对以下代码产生了兴趣,如下:
1 | String s ="hello" + 123 + true + 1.32; |
由上可知,任何变量(不管是基本数据类型,还是引用数据类型)都可以自动向String进行转换,以完成最后的拼接。那么,这背后的操作是如何实现的呢?
原理剖析
引用数据类型向String的转换
引用数据类型,也就是我们常说的类类型,在java中都共同拥有一个顶层父类Object
,而在这个Object
类中,我们可以发现这样一个方法toString()
,其源码如下:
1 | /** |
通过阅读方法注释,我们不难知道:这个方法是用来输出一个object对象的。所有Java类都是object类的子类,因此所有Java对象都具有toString
方法。
不仅如此,所有Java对象都可以和字符串进行连接运算,当Java对象和字符串进行连接运算时,系统自动调用Java对象toString()方法,返回值和字符串进行连接运算。
基本数据类型向String的转换
首先,我们知道在Java中,一切皆对象,但八大基本类型却不是对象。通过上述分析,我们可以解释对象通过toString()
转换为字符串后与String对象完成拼接,那么基本数据类型又是如何完成这一过程的呢?
要解释这一问题,就要涉及java中基本数据类型的自动装箱技术。
所谓装箱,就是把基本类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double,等等。
J2SE5.0后提供了自动装箱与拆箱的功能,此功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的方法,决定是否进行装箱或拆箱动作。
自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。
通过自动装箱,我们就可以很好的解释为什么基本数据类型int
、float
等能够完成向String
的转换与拼接。整个过程就是,编译器检测到我们需要进行int
与字符串的拼接,首先自动帮我们将int
自动装箱成Integer
对象,然后Integer
对象调用自身的toString()
方法转为字符串,最终完成拼接工作。
参考文章