【问题标题】:Why print statement calls **toString** method in java?为什么print语句在java中调用**toString**方法?
【发布时间】:2014-02-28 07:46:08
【问题描述】:

为什么下面的代码段会自动调用 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 一样“为什么不调用”应该给出对象的字符串表示形式。
  • @user2357112 你没有java编译器或JDK吗?
  • 无法识别ublic 或Syatem。

标签: java object-to-string


【解决方案1】:

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()。量子力学

【讨论】:

    【解决方案2】:

    Java 的设计者决定,他们希望使用类似这样的语句,让打印任何对象变得既美观又简单。

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

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

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

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

    【讨论】:

    • 脱帽致敬 :) 非常感谢!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      打印对象的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
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多