![](/img/trans.png)
[英]toString in java - System.out.println vs log in Android
[英]The connection between 'System.out.println()' and 'toString()' in Java
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"
。 那么,当我将obj
对象引用作为参数传递给它时,谁能解释一下System.out.println()
的工作原理是什么? 它是否与toString()
方法完全连接?
System.out
是一个PrintStream
。 Printstream 定义了println()
函数的多个版本来处理数字、字符串等。 当您使用任意对象作为参数调用PrintStream.println()
时,您将获得作用于Object
的函数版本。 这个版本的功能
...首先调用 String.valueOf(x) 以获取打印对象的字符串值...
查看String.valueOf(Object)
,我们看到它返回
如果参数为空,则字符串等于“空”; 否则,返回 obj.toString() 的值。
因此,长话短说, System.out.println(someObject)
调用该对象的toString()
函数将对象转换为字符串表示。
如果您的对象定义了自己的toString()
函数,那么它将被调用。 如果您不提供这样的函数,那么您的对象将从其父类之一继承toString()
。 在最坏的情况下,它将继承Object.toString()
。 该版本的 toString() 被定义为返回
一个字符串,由对象是其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示组成。
或者,换句话说:
getClass().getName() + '@' + Integer.toHexString(hashCode())
因此,当您在未定义自己的 toString() 版本的对象上调用System.out.println()
时,您可能会得到类似于“classname@someHexNumber”的Object
版本。
toString()
是所有类都存在于Object
类(继承树的根toString()
中的方法。
System.out.print()
(SOP) 将在馈送对象时调用 toString 方法。
如果不覆盖toString()
方法,SOP 将调用父类toString()
,如果 parent 是 Object 类,它将打印对象的 hashCode
如果您覆盖该方法,SOP 将调用您的toString()
方法
System.out.println(obj) 将打印从 obj.toString() 返回的字符串,如果您不覆盖它,它将调用基础 object.toString() 方法,默认情况下,类 Object 的 toString 方法返回一个由以下内容组成的字符串对象是其实例的类的名称,符号字符“@”,以及对象哈希码的无符号十六进制表示。 换句话说,此方法返回一个等于以下值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.