toString方法
方法的声明
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#0000ff">toString</span>()</span></span>
文档解释
关于toString()方法的作用,在官方JDK文档中,有详细的说明,主要是以下四点:
-
返回该对象(调用toString方法的对象)的字符串表示。通常,toString()方法会返回一个"以文本方式表示"此对象的字符串。
-
结果应是一个简明但易于读懂的信息表达式。
-
建议所有子类都重写此方法。
所以,toString()方法的作用非常简单,说白了,把对象转换成字符串,就和它的方法名一样。而且这个字符串要简洁明了,能够用来描述这个对象,而且最后一句话,已经表明了:Java设计者自己都觉得Object类当中的,toString()方法的默认实现不是一个最优解,子类可以根据自身情况选择重写它。
现在,我们先来看一看toString()方法在Object类当中的默认实现。
默认实现
toString()方法在Object类当中的代码实现,非常简单,如下:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#0000ff">toString</span>() {
<span style="color:#770088">return</span> <span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>() <span style="color:#981a1a">+</span> <span style="color:#aa1111">"@"</span> <span style="color:#981a1a">+</span> <span style="color:#008855">Integer</span>.<span style="color:#000000">toHexString</span>(<span style="color:#000000">hashCode</span>());
}</span></span>
该方法会返回一个字符串,这个字符串的组成是:
-
用当前对象调用getClass()方法(注意这里是省略了this.)获取运行时类对象后,直接调用getName()方法,获取该类型的全限定类名。
-
Object类当中,hashCode()方法的默认实现是通过计算对象的地址,转换成一个十进制的数字来实现的。一般认为它的返回值是该对象的十进制地址值。
Integer.toHexString(int)方法是将一个十进制整数转换成十六进制字符串
所以,Integer.toHexString(hashCode())整体表示的字符串就是:该对象的十六进制地址值。
以上,将内容全部连接起来,该方法的返回值字符串就是:
全限定类名 + @ + 对象的十六进制地址值
注意事项
隐式调用toString方法
在Java代码中,存在以下两种情况会隐式调用该对象的toString()方法:
-
直接打印一个对象名(引用)。
-
对象名(引用)参与字符串拼接。
// s是一个引用
System.out.println(s);
System.out.println(s + "hello");
toString方法的结果
toString()方法的结果又要分成两种情况:
-
本类中没有重写该方法。
就会去使用Object类的默认实现,打印对象名会打印地址值。很显然在多数时候,我们并不关心全限定类名和地址值,所以文档说明中推荐子类重写该方法。
-
本类中重写了该方法
toString方法重写的快捷键Alt + Insert。重写后,我们再去打印对象名,或者用对象名拼接字符串,看到的就不再是地址值了,而是我们重写后toString()方法的执行结果。