Java中System.out.println()
和toString()
之间的联系是什么? e.g:
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()
对象引用作为参数传递给它时,有人可以解释obj
的工作原理是什么吗?它是否与toString()
方法完全相关?
答案 0 :(得分:13)
System.out
是PrintStream
。 Printstream定义了println()
函数的几个版本来处理数字,字符串等。当您使用任意对象作为参数调用PrintStream.println()
时,您将获得the version of the function that acts on an 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())
因此,当您在未定义其自己的toString()版本的对象上调用System.out.println()
时,您可能会得到Object
版本,其类似于“classname @ someHexNumber”。
答案 1 :(得分:3)
toString()
是存在于所有类的Object
类(继承树的根)中的方法。
System.out.print()
(SOP)将在输入对象时调用toString方法。
如果你不覆盖方法toString()
,SOP将调用父toString()
,如果父是Object类,它将打印对象的hashCode
如果您覆盖该方法,SOP会调用您的toString()
方法
答案 2 :(得分:0)
System.out.println(obj)将从obj.toString()打印返回的字符串,如果你不覆盖它,它将调用基类object.toString()方法,默认情况下,类Object的toString方法返回一个字符串由对象是实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())