我知道println
对象的System.out
方法可用于打印任何对象,无论它属于哪个类。但有人能告诉我println
用来完成这项任务的机制吗?
答案 0 :(得分:7)
在对象上调用System.out.println
使用Object
的{{1}}方法 - toString()
类中的默认实现,或者覆盖此类的类的实现默认值。
System.out.println最终使用Object
种PrintStream
种方法之一,因为println
是System.out
个实例。
如果您将PrintStream
传递给String
,则会致电System.out.println
。如果您将println(String)
传递给它,则会调用char[]
。如果您传递任何其他类型的println(char[])
,它将调用Object
(除非编译器决定将println(Object)
转换为Object
,使用对象' { {1}}方法,然后再调用String
。
toString()
通过调用println(String)
将println(Object x)
转换为Object
,String
将返回" null" (对于null对象)或String.valueOf()
。
无论哪种方式,都使用obj.toString()
Object
方法,除非toString()
为空。
答案 1 :(得分:-1)
PrintStream/PrintWriter.println(...)
对待String
的方式与编译器对待String
的方式之间的差异非常小。打印流将通过Object
方法自动将String
转换为toString()
,除非该对象为null
(在这种情况下,它会打印null
)。不同之处在于您无法将String
对象设置为常规Object
- 但可以将String
对象与通用{{1}连接在一起}将通过Object
方法连接(除非toString()
为Object
)。坦率地说,这通常是你如何使用null
方法。这是一个示例程序,说明了差异:
toString()
以下是该计划的输出:
public class PrintStreamTester {
public static void main(String... args) {
final MyObject o1 = null;
final MyObject o2 = new MyObject("blah blah blah");
String s1 = "o1.toString() failed";
try {
s1 = o1.toString();
} catch (NullPointerException npe) {
// who cares
}
final String s2 = "" + o1;
final String s3 = o2.toString();
final String s4 = "" + o2;
System.out.println("o1 by itself (below):");
System.out.println(o1);
System.out.println("o1's toString(): " + s1);
System.out.println("o1's \"\" + o1: " + s2);
System.out.println("o2 by itself (below):");
System.out.println(o2);
System.out.println("o2's toString(): " + s3);
System.out.println("o2's \"\" + o1: " + s4);
}
}
class MyObject {
private final String string;
public MyObject(final String string) {
this.string = string;
}
@Override
public String toString() {
return string;
}
}