shenzhi
2015-12-04 11:45
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)));
}
}输出结果是:
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
代码中并没有调用过toString()方法,为什么最后输出的时候会自动调用了呢?
如果你输出的是对象,d1等效为d1.toString()下面是理由:
1、System.out.println(center.toString())这句对应的源码:
public void println(String x) {
synchronized (this) {
print(x); // 打印x
newLine(); // 换行
}
}
这能看懂吧,直接输出了传进来的参数x(center.toString())
2、System.out.println(center)这句对应的源码:
public void println(Object x) {
String s = String.valueOf(x); // x对象转换为String
synchronized (this) {
print(s);
newLine();
}
}
主要看String s = String.valueOf(x);这句,然后再看看是怎么把对象x转换为String的,
String.valueOf(x)对应的源码:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
这下看到了吧,把刚才那x(也就是你的center)转换为String是调用了obj.toString()得到
的。
所以"直接输出对象时,会默认调用对象toString()方法
Java入门第二季
531287 学习 · 6327 问题
相似问题