仔细观察下面这些短短的代码
package com.string;
public class ToStringTest {
static int i = 1;
public static void main(String args[]){
System.out.println("love " + new ToStringTest());
ToStringTest a = new ToStringTest();
a.i++;
System.out.println("me " + a.i);
}
public String toString(){
System.out.print("I ");//I
return "java ";
}
}
执行的结果如下
I love java
me 2
我们一起来看一看为什么是这样的结果。
查看println方法的源码
找到参数分别是String和object类型的源码
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
可以看到当参数为Object类型的时候先调用String.valueOf()方法,将object类型转换程String类型。再看valueOf源码
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
如果obj为空的话,返回null,否则返回obj.toString()。