打印对象时为什么会自动调用toString( )方法?
println(Object obj)源码:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
print(Object obj)源码:
public void print(Object obj) {
write(String.valueOf(obj));
}
valueOf(Object obj)源码:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Object类的toString()定义:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
该符号字符的类的名称的字符串+“ @ ”和对象的哈希码的无符号的十六进制表示。
打印其实是把对象toString()方法返回的值打印出来,String自己本身重写了toSting()方法,打印String对象,不需要重写toString()方法。
所有类都是继承自object,object类具有一个tostring()方法,你创建的每个类都会继承该方法。它返回对象的一个string表示,并且对于调试非常有帮助。然而对于默认的tostring()方法往往不能满足需求,需要覆盖这个方法。
JDK中解释如下:
public void print(Object obj)
打印一个对象。 由String.valueOf(Object)方法生成的字符串根据平台的默认字符编码进行转换为字节,这些字节的write(int)完全按照write(int)的方式编写。
public void write(int b)
将指定的字节写入此流。 如果字节是换行符,并且启用自动刷新,则将调用flush方法。
请注意,该字节写为给定; 根据平台的默认字符编码编写一个将被翻译的字符,使用print(char)或println(char) 方法。
PrintWriter类提供的flush方法,flush方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区。
- 由于缓冲,字符串可能实际上没有出现在该文件中,直到调用flush()或close()方法被调用.
- 一般的文件流操作都包含缓冲机制,write方法并不直接将数据写入文件,而是先写入内存中特定的缓冲区。
- 正常情况下缓冲区满时,操作系统会自动将缓冲数据写入到文件中。
- 至于close方法,原理是内部先调用flush方法来刷新缓冲区,再执行关闭操作,这样即使缓冲区数据未满也能保证数据的完整性。
- 如果进程意外退出或正常退出时而未执行文件的close方法,缓冲区中的内容将会丢失。
public void println(Object x)
打印一个对象,然后终止该行。 此方法首先调用String.valueOf(Object)来获取打印对象的字符串值,然后表现为调用print(String)然后println() 。
{
public static String valueOf(Object obj)
返回 Object参数的字符串 Object形式。
如果参数是null ,那么一个字符串等于"null" ; 否则返回值obj.toString() 。
public String toString()返回对象的字符串表示形式。
{
toString(Object obj)返回对象 obj 的一个实例:
该符号字符的类的名称的字符串+“ @ ”和对象的哈希码的无符号的十六进制表示。
换句话说,这个方法返回一个等于下列值的字符串:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
}
}