为什么这段 Java 代码会隐式调用 toString() 方法?

Why does this Java code implicitly calls toString() method?

为什么是输出? : 球体 0

它以某种方式隐式调用了 toString() 方法?这是如何工作的?

class BerylliumSphere {
    private static long counter = 0;
    private final long id = counter++;
    public String toString() { 
        return "Sphere " + id;
    }
}

public class Test {
    public static void main (String[] args) {
        BerylliumSphere spheres = new BerylliumSphere();
        System.out.println(spheres);
    }
}

// output: Sphere 0 

当您尝试 System.out.println(spheres) 时,它看起来如下所示:

public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

这是valueOf(Object obj)方法:

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

这是 System.out.println 的作用:https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println%28java.lang.Object%29

内容如下:

This method calls at first String.valueOf(x) to get the printed object's string value, then behaves as though it invokes print(String) and then println().

下面是 String.valueOf 的作用:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#valueOf%28java.lang.Object%29

它说:

If the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned.

简而言之,打印对象将导致调用其 toString 方法并打印其内容 returns。

System.out 是一个 PrintStream 实例,它是 System 的静态成员。 PrintStream class 有一个函数 println() 接受类型 Object 的参数。该函数在 Open JDK 中如下所示:

public void println(Object x) {
     String s = String.valueOf(x);
     synchronized (this) {
         print(s);
         newLine();
     }
}

如果您查看 String.valueOf(),它接受 Object 类型的参数,您可以看到:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

没有魔法。它只是一个 Java class 在对象上调用 toString

进一步阅读