java 在 Object 类中提供了默认的 toString 方法,此方法的结果是根据对象的hasCode转换十进制字符串
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
但是这个方法非常不友好,默认给出的信息几乎没有什么意义。 比如
public class Point {
private final int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Demo {
public static void main(String[] args) {
Point point = new Point(1,2);
System.out.println(point.toString());
}
}
com.sc.Point@74a14482
我们只能看出这是一个 com.sc.Point 对象,其他的一无所知,后面的是它的内存地址,但对于程序员来说,知道这一个内存地址也没有用,实际开发时,我们会记录 log ,这时候如果要记录对象信息,logger 就会调用 对象的 toString 方法,所以,覆盖 toString ,改为友好的格式,有助于 log 记录时,能记录下更详细更清晰有助于 debug 的日志信息
public String toString() {
return "Point(x=" + this.x + ", y=" + this.y + ")";
}
那么,再执行上面的代码 得到的就是 Point(x=1, y=2)
这样的信息在执行 log.info log.debug log.error 等时候,也能得到友好的信息。
注意: toString 之后的格式是给程序员看的,尽量不要依赖这个toString 后的格式去做数据交换,如果需要交互数据,可以考虑 json 等正规的交互格式,而不是 String 字符串
关于toString方法,阿里巴巴开发规约里面也专门做了要求: