为什么下面的代码段会自动调用toString()方法?
代码:
public class Demo {
public Demo() {
System.out.println(this); // Why does this line automatically calls toString()?
}
public static void main(String[] args) {
Demo dm = new Demo();
}
}
为什么下面的代码段会自动调用toString()方法?
public class Demo {
public Demo() {
System.out.println(this); // Why does this line automatically calls toString()?
}
public static void main(String[] args) {
Demo dm = new Demo();
}
}
println
为各种类型重载,您正在调用的类型是:
java.io.PrintStream.println(java.lang.Object)
看起来像这样:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
String.valueOf
看起来像这样:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
所以你可以看到它调用toString()
你的对象。量子点
Java 的设计者决定,他们想让打印任何对象变得简单易用,使用如下语句
System.out.println(something);
System.out.print(something);
someOtherPrintWriter.println(something);
程序员不必过多担心something
实际是什么,因此他们制作了这些方法的许多版本。但是他们无法预料到有人可能想要打印的每个可能的类。
但是因为每个类Object
都可以直接或间接地扩展,所以他们需要做的就是使任何可打印的实例成为Object
可打印的——这基本上意味着提供一种将 any 转换Object
为String
.
他们通过toString
在类中包含一个方法Object
,并制作print
和println
使用它来做到这一点。然后,如果有人编写一个类并需要以特定方式打印它的对象,他们所需要做的就是 override toString
,然后print
两者println
都将按照程序员的期望进行。
打印对象的java代码
public void println(Object paramObject)
{
String str = String.valueOf(paramObject); // Use valueOf method
synchronized (this) {
print(str);
newLine();
}
}
String 的 valueOf 方法
public static String valueOf(Object paramObject)
{
return paramObject == null ? "null" : paramObject.toString(); // toString() method is called
}
当 System.out.println() 被调用时,它会尝试在屏幕上打印一些东西(显然)可以打印的东西是一个字符串,所以你给方法作为参数的每个对象都将被“转换”到可以写入输出的东西,所以它调用 .toString() 方法