0

为什么下面的代码段会自动调用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();
   }
}
4

4 回答 4

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()你的对象。量子点

于 2014-02-28T07:52:03.763 回答
1

Java 的设计者决定,他们想让打印任何对象变得简单易用,使用如下语句

System.out.println(something);
System.out.print(something);
someOtherPrintWriter.println(something);

程序员不必过多担心something实际是什么,因此他们制作了这些方法的许多版本。但是他们无法预料到有人可能想要打印的每个可能的类。

但是因为每个类Object都可以直接或间接地扩展,所以他们需要做的就是使任何可打印的实例成为Object可打印的——这基本上意味着提供一种将 any 转换ObjectString.

他们通过toString在类中包含一个方法Object,并制作printprintln使用它来做到这一点。然后,如果有人编写一个类并需要以特定方式打印它的对象,他们所需要做的就是 override toString,然后print两者println都将按照程序员的期望进行。

于 2014-02-28T08:00:52.267 回答
0

打印对象的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
  }
于 2014-02-28T07:54:18.560 回答
0

当 System.out.println() 被调用时,它会尝试在屏幕上打印一些东西(显然)可以打印的东西是一个字符串,所以你给方法作为参数的每个对象都将被“转换”到可以写入输出的东西,所以它调用 .toString() 方法

于 2014-02-28T07:50:50.180 回答