11

如果我正在打印该类的一个对象,那么toString()即使我没有编写toString()方法,它也会打印方法实现,那么实现是什么,它是如何在toString()内部调用的?

4

5 回答 5

57

您没有显式调用toString(),但隐含地是:

看:

System.out.println(foo); // foo is a non primitive variable

System是一个类,有一个static字段out,类型为PrintStream。所以你正在调用println(Object)a 的方法PrintStream

它是这样实现的:

   public void println(Object x) {
       String s = String.valueOf(x);
       synchronized (this) {
           print(s);
           newLine();
       }
   }

如我们所见,它正在调用该String.valueOf(Object)方法。
这是按如下方式实现的:

   public static String valueOf(Object obj) {
       return (obj == null) ? "null" : obj.toString();
   }

你看,这toString()就是所谓的。

于 2013-06-11T18:58:18.093 回答
9

Java 中的每个对象也是IS-A (n) Object。因此,如果toString()类没有提供实现,则默认值Object.toString()会自动调用。

Object.toString()默认实现只是打印对象的类名,后跟对象的哈希码,这不是很有帮助。因此,通常应该重写toString()以提供对象运行时状态的更有意义的字符串表示。

即使我没有编写 toString() 方法,那么实现是什么,它是如何在内部调用 toString() 的?

toString()是在某些编程情况下被隐式调用equals()的少数方法(如等hashCode())之一(仅举几个例子)

  • 使用打印对象println()
  • 打印一个Collection对象toString()在所有元素上调用)
  • 与字符串连接(如strObj = "My obj as string is " + myObj;
于 2013-06-11T19:03:26.750 回答
5

一切都继承自 Object,因此如果您尚未定义对象,则将调用 Object 上的toString 。

于 2013-06-11T18:47:43.850 回答
0

toString() 方法存在于 Object 类中,因此当您将 obj 放入 System.out.println(obj); 时,它会隐含地调用 Object 类中存在的 toString() 方法,因为每个用户创建的类都将隐式继承 Object 类,因此您新创建的类,这意味着 toString() 在您的类中可用,因此它将打印例如:“PkgNamePackage.Classname@12cf4” 但是,如果您明确覆盖 toString 方法并提供您自己的实现,那么它将写入字符串 what你曾经放弃过重写的tostring方法();前任:

public class DogArray {
    @Override
    public String toString() {
        return "Im the newly created Object";
    }

    public static void main(String args[]) {
        DogArray d1 = new DogArray();
        System.out.println(d1);
    }
}

output: Im the newly created Object
于 2013-12-04T01:48:41.550 回答
-1

在java中,对象类是每个类的超类。每当您将参数传递给system.out.println内部对象类到字符串方法时,它将被执行。它返回给定的类名@引用值,但根据我们的应用程序要求对象类到字符串方法将在集合和字符串类中覆盖。它返回它们的内容。

于 2016-11-28T02:56:37.893 回答