为什么以下代码段自动调用 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();
}
}
答案 0 :(得分:3)
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()
。 QED
答案 1 :(得分:0)
当调用System.out.println()时,它会尝试在屏幕上打印一些东西(显然)可以打印的一件事是一个字符串,所以你给方法作为参数的每一个对象都是'转换'为可以写入输出的东西,因此它调用.toString()方法
答案 2 :(得分:0)
用于打印Object的java代码
public void println(Object paramObject)
{
String str = String.valueOf(paramObject); // Use valueOf method
synchronized (this) {
print(str);
newLine();
}
}
valueOf String
的方法public static String valueOf(Object paramObject)
{
return paramObject == null ? "null" : paramObject.toString(); // toString() method is called
}
答案 3 :(得分:0)
Java的设计者决定使用像
之类的语句来打印任何对象。System.out.println(something);
System.out.print(something);
someOtherPrintWriter.println(something);
没有程序员不必过多担心something
实际上是什么,所以他们制作了很多这些方法的版本。但他们无法预料到某个人可能想要打印一个对象的可能类。
但是因为每个类都直接或间接地扩展Object
,所以他们需要做的只是创建Object
可打印的任何实例 - 这基本上意味着提供转换任何{{1}的方法}到Object
。
他们通过在String
课程中加入toString
方法,并使Object
和print
使用它来做到这一点。然后,如果有人写了一个类并需要它以特定的方式打印对象,他们需要做的就是覆盖println
,然后toString
和print
都会做程序员期待。