Java--输出对象默认调用toString方法

先来观察观察下面这个小例子

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。

你可能感兴趣的:(java)