对象如何隐式调用toString方法?

use*_*808 8 java

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

jlo*_*rdo 47

你没有明确地打电话toString(),但暗示你是:

看到:

System.out.println(foo); // foo is a non primitive variable
Run Code Online (Sandbox Code Playgroud)

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

它实现如下:

   public void println(Object x) {
       String s = String.valueOf(x);
       synchronized (this) {
           print(s);
           newLine();
       }
   }
Run Code Online (Sandbox Code Playgroud)

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

   public static String valueOf(Object obj) {
       return (obj == null) ? "null" : obj.toString();
   }
Run Code Online (Sandbox Code Playgroud)

在这里你看,这toString()就是所谓的.

  • @ user2475808:那我希望你不要忘记接受它;)(绿色复选标记). (7认同)

Rav*_*yal 6

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

Object.toString()默认实现简单的打印对象的类名,后跟该对象的散列码这是不是非常有帮助.因此,通常应该重写toString()以提供对象运行时状态的更有意义的String表示.

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

toString()是为数不多的方法(如一个equals(),hashCode()等)被隐式调用下一样(只是命名一些)某些方案的情况下

  • 使用打印对象 println()
  • 打印一个Collection对象(toString()在所有元素上调用)
  • 串联连接(如strObj = "My obj as string is " + myObj;)


Nim*_*sky 5

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

  • 除了原语:) (4认同)
  • @ user2475808什么? (2认同)