这条其实也好理解,如果没有覆盖toString方法,在调用诸如System.out.println()时,会默认调用Object.toString()方法,输出一个对象引用地址。覆盖toString方法会使这样的输出变得更有意义,是代码日志更可读。
不过如同equals和hashCode方法一样,apache common包里提供了ToStringBuilder来完成相同的工作:
public class Person {
String name;
int age;
boolean smoker;
...
public String toString() {
return new ToStringBuilder(this).
append("name", name).
append("age", age).
append("smoker", smoker).
toString();
}
}
这个相对而言更方便。或者更偷懒的,可以用BeanUtils.describe()将对象所有的域转变为一个map,然后在将map打出来:
@Override
public String toString(){
try{
return BeanUtils.describe(this).toString();
}
catch(Exception e)
{
return e.toString();
}
}
不过注意,这么做有时会很累赘,且如果对象中动用了反射机制,诸如动态代理之类,往往会发生错误。