为什么这段 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
。
进一步阅读
- 查看 PrintStream 的文档 class:https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html
为什么是输出? : 球体 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
。
进一步阅读
- 查看 PrintStream 的文档 class:https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html