为什么在java中打印语句调用** toString **方法?

时间:2014-02-28 07:46:08

标签: java object-to-string

为什么以下代码段自动调用 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 个答案:

答案 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方法,并使Objectprint使用它来做到这一点。然后,如果有人写了一个类并需要它以特定的方式打印对象,他们需要做的就是覆盖println,然后toStringprint都会做程序员期待。