//: object/HelloDate.java
package chapter1;
import java.util.Date;
/**
* The first Thinking in java program Displays a string and today's date
*
* @author stone
* @version 4.0
*/
public class HelloDate {
/**
* Entry point to class & application.
*
* @param args
* array of string arguments
* @throws exceptions
* No exception thrown
*/
public static void main(String[] args) {
System.out.println(new Date());
}
}/*
* Output: (55% match) Thur May 29 22:24:46 CST 2014
*/// :~
如上代码中调用了System.out.println(),但是传入其中的参数是Date的一个实例,输出结果为
Thur May 29 22:24:46 CST 2014
为什么会输出这样的结果呢?
查看JAVA源代码,真相大白啦
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
out是PrintStream的一个实例,out调用方法println(Object x);然后查看String类的valueOf源代码
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
方法alueOf(),调用了object的toString()方法,如果一个类重写了toString()方法,那么调用时,就会调用重写后的toString()方法,若是没有重写,则调用基类object的toString()方法。object的toString()方法如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
该方法利用反射返回了类名和类的哈希值,观察程序的输出结果,很显然Date重写了toString()方法,查看Date的源码
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == gcal.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
结果正如我们所料,以上为Date的toString()方法。
大功告成。