Java中’System.out.println()’和’toString()’之间的连接

Java中System.out.println()toString()之间的连接是什么? 例如:

 public class A { String x = "abc"; public String toString() { return x; } } public class ADemo { public static void main(String[] args) { A obj = new A(); System.out.println(obj); } } 

如果主类运行,则输出为"abc" 。 当我删除覆盖toString()的代码时,它输出为"A@659e0bfd" 。 那么,当我使用参数作为对象时,是否可以解释System.out.println()的工作原理是什么? 是否与toString()方法完全连接?

System.out是一个PrintStream 。 Printstream定义了println()函数的几个版本来处理数字,字符串等。 当您使用任意对象作为参数调用PrintStream.println()时,您将获得作用于Object的函数的版本 。 这个版本的function

…首先调用String.valueOf(x)来获取打印对象的字符串值…

看看String.valueOf(Object) ,我们看到它返回

如果参数为null,则字符串等于“null”; 否则,返回obj.toString()的值。

因此,很长一段时间, System.out.println(someObject)调用该对象的toString()函数将对象转换为字符串表示。

如果你的对象定义了自己的toString()函数,那么这将被调用。 如果您不提供此类函数,那么您的对象将从其父类之一inheritancetoString() 。 在最坏的情况下,它将inheritanceObject.toString() 。 该版本的toString()被定义为返回

一个字符串,由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号hex表示组成。

或者,换句话说:

 getClass().getName() + '@' + Integer.toHexString(hashCode()) 

因此,当您在未定义其自己的toString()版本的对象上调用System.out.println()时,您可能会获得看起来像“classname @ someHexNumber”的Object版本。

toString()是存在于所有类的Object类(inheritance树的根toString()中的方法。

System.out.print() (SOP)将在提供对象时调用toString方法。

如果不覆盖方法toString() ,SOP将调用父toString() ,如果parent是Object类,它将打印对象的hashCode

如果覆盖该方法,SOP将调用您的toString()方法

System.out.println(obj)将从obj.toString()打印返回的字符串,如果你不覆盖它,它将调用基础object.toString()方法,默认情况下,类Object的toString方法返回一个由对象是实例的类的名称,at符号字符“@”,以及对象的哈希码的无符号hex表示。 换句话说,此方法返回一个等于值的字符串:

  getClass().getName() + '@' + Integer.toHexString(hashCode())