為什么沒(méi)有調(diào)用類中的toString()方法,卻自動(dòng)實(shí)現(xiàn)了轉(zhuǎn)換?
package?test; public?class?MyDate?{ int?year; int?month; int?day; void?set(int?y,int?m,int?d){ year=y; month=m; day=d; } void?set(MyDate?d){ set(d.year,d.month,d.day); } public?String?toString(){ return?year+"年"+month+"月"+day+"日"; } public?boolean?equals(MyDate?d){ return?this==d||d!=null&&year==d.year&&month==d.month&&day==d.day; } public?static?void?main(String?args[]){ MyDate?d1=new?MyDate(); d1.set(2009,7,16); MyDate?d2=d1; System.out.println("d1:"+d1+",d2:"+d2+",d1==d2?"+(d1==d2)); d2.year=2008; System.out.println("d1:"+d1+",d2:"+d2+",d1==d2?"+(d1==d2)+",d1.eguals(d2)?"+(d1.equals(d2))); d2=new?MyDate(); d2.set(d1); System.out.println("d1:"+d1+",d2:"+d2+",d1==d2?"+(d1==d2)+",d1.eguals(d2)?"+(d1.equals(d2))); } }
輸出結(jié)果是:
d1:2009年7月16日,d2:2009年7月16日,d1==d2?true
d1:2008年7月16日,d2:2008年7月16日,d1==d2?true,d1.eguals(d2)?true
d1:2008年7月16日,d2:2008年7月16日,d1==d2?false,d1.eguals(d2)?true
代碼中并沒(méi)有調(diào)用過(guò)toString()方法,為什么最后輸出的時(shí)候會(huì)自動(dòng)調(diào)用了呢?
2015-12-04
如果你輸出的是對(duì)象,d1等效為d1.toString()下面是理由:
1、System.out.println(center.toString())這句對(duì)應(yīng)的源碼:
public?void?println(String?x)?{
????synchronized?(this)?{
????????print(x);?//?打印x
????????newLine();?//?換行
?}
}
這能看懂吧,直接輸出了傳進(jìn)來(lái)的參數(shù)x(center.toString())
2、System.out.println(center)這句對(duì)應(yīng)的源碼:
public?void?println(Object?x)?{
????????String?s?=?String.valueOf(x);?//?x對(duì)象轉(zhuǎn)換為String
????????synchronized?(this)?{
????????????print(s);
????????????newLine();
????????}
????}
?主要看String?s?=?String.valueOf(x);這句,然后再看看是怎么把對(duì)象x轉(zhuǎn)換為String的,
?String.valueOf(x)對(duì)應(yīng)的源碼:
?public?static?String?valueOf(Object?obj)?{
????return?(obj?==?null)???"null"?:?obj.toString();
????}
??這下看到了吧,把剛才那x(也就是你的center)轉(zhuǎn)換為String是調(diào)用了obj.toString()得到
??的。
??所以"直接輸出對(duì)象時(shí),會(huì)默認(rèn)調(diào)用對(duì)象toString()方法