什么是连接 System.out.println()
和 toString()
在Java?例如:
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
。这个版本的功能
...首先调用String.valueOf(x)来获取打印对象的字符串值...
看着 String.valueOf(Object)
,我们看到它回归
如果参数为null,则字符串等于“null”;否则,返回obj.toString()的值。
所以,长话短说, System.out.println(someObject)
调用该对象 toString()
用于将对象转换为字符串表示的函数。
如果您的对象定义了自己的对象 toString()
函数,那就是将要调用的函数。如果您不提供此类功能,那么您的对象将继承 toString()
来自其中一个父类。在最坏的情况下,它将继承 Object.toString()
。该版本的toString()被定义为返回
一个字符串,由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。
或者,换句话说:
getClass().getName() + '@' + Integer.toHexString(hashCode())
所以,当你打电话的时候 System.out.println()
在没有定义自己的toString()版本的对象上,你可能得到了 Object
看起来像“classname @ someHexNumber”的版本。
toString()
是一种存在于中的方法 Object
所有类的class(继承树的根)。
System.out.print()
(SOP)将在提供对象时调用toString方法。
如果您不覆盖该方法 toString()
,SOP将致电父母 toString()
其中,如果parent是Object类,它将打印该对象的hashCode
如果您覆盖该方法,SOP将拨打您的电话 toString()
方法
System.out.println(obj)将从obj.toString()打印返回的字符串,如果你不覆盖它,它将调用基础object.toString()方法,默认情况下,类Object的toString方法返回一个由对象是实例的类的名称,at符号字符“@”,以及对象的哈希码的无符号十六进制表示。换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())