先来观察观察下面这个小例子
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()。
现在再来解释上面例子
主函数中输出语句里扫描出有对象,所以先调用了该对象类中的toString方法,输出了("i "),然后输出love,接着是String函数,返回返回值 java。