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())