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

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

你没有显式调用toString() ,但是你有以下含义:

看到:

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

System是一个类,具有PrintStream类型的static字段out 。 所以你要调用PrintStreamprintln(Object)方法。

它实现如下:

  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()被调用。

一切都inheritance自Object,因此如果您没有定义一个toString ,将调用它。

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

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

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

toString()是少数方法之一(如equals()hashCode()等),在某些程序化情况下隐式调用 (仅命名一些)

  • 使用println()打印对象
  • 打印对象集合(在所有元素上调用toString()
  • 与字符串连接(如strObj = "My obj as string is " + myObj;

toString()方法存在于Object类中,所以当你把obj放在System.out.println(obj);中时,它会隐含地调用Object类中的toString(),因为每个用户创建的类都会隐式inheritanceObject类,所以你的新创建的类,这意味着toString()在ur类中可用,因此它将打印类似于例如:“PkgNamePackage.Classname@12cf4”但是如果你明确地重写toString方法并给出你自己的实现,那么它会写出字符串是什么永远你用Overriden 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 

在java对象类中是每个类的超类。每当你传递参数到system.out.println内部对象类到字符串方法将被excuted.it返回类名@引用值但是根据我们的应用程序需求对象class to string方法将在集合中重写,字符串class.it返回其内容。