我有一个问题,为什么在main方法调用printPersonPrinting()方法时隐式调用toString()方法。
public class PersonPrinting {
private String name;
private int age;
public PersonPrinting(String aName, int anAge) {
name = aName;
age = anAge;
}
public String toString() {
return name + " " + age;
}
public void printPersonPrinting() {
System.out.println(this);
}
public static void main (String [] args) {
PersonPrinting p = new PersonPrinting("Dan",10);
//printPersonPrinting is called, but toString isn't.
//But the output is formatted by toString method.
p.printPersonPrinting();
}
}
此代码的输出是 - >丹10
谢谢!
答案 0 :(得分:11)
这就是Java的工作方式。默认情况下,System.out.println()
会调用其param对象上的toString()
方法将其转换为字符串表示形式。
如果对象的类没有覆盖toString()
方法,则可能会得到类似className@someHexadecimalNumber
的结果。 (这是toString()
类中Object
方法默认实现的结果)
答案 1 :(得分:8)
因为System.out.println(this);
调用
String.valueOf(this)
反过来调用
this.toString()
它基本上是System.out.println(this.toString());
。
System.out
是PrintStream
,因此您可以看到PrintStream.println(Object)
(部分)
此方法首先调用
String.valueOf(x)
来获取打印对象的字符串值,然后就像调用print(String)
然后调用println()
一样。
答案 2 :(得分:2)
Java方法隐式调用...为什么?
一个答案是(基本上),这是指定println(Object)
工作的方式。
另一个答案是,这是最好的(简单)设计选择。考虑:
println(Object)
应该输出对象的文本呈现
有两种选择:
使用通用机制呈现对象
使用渲染方法(如toString()
)
考虑"泛型机制",它将如何决定要渲染的对象的哪些字段以及如何渲染它们?除非程序员能够以某种方式定制渲染,否则通用机制不可能“正确”#34;。与编写toString()
方法相比,剪裁可能更复杂。
考虑toString()
方法,可以重写该方法,以便像程序员想要的那样呈现对象。
现在可以肯定的是,一种简单的toString()
方法往往不够灵活,但可以通过各种方式解决; e.g。
使用PrintWriter.format(...)
进行格式化/写作,或
使用生成字符串和PrintWriter.print(String)
。
(对于需要渲染和输出大量文本的情况,您需要使用不同的方法;即不是PrintWriter
。这是一个不同的主题。)