首先来看看在类Object中toString()方法的定义:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
从定义中可以看出,Object对toString的实现是将调用toString()方法的类的名字(什么名字?后面会说)和类的hashCode的十六进制通过一个 @ 符号连接起来的。
其中的getClass()方法,解释如下:
/** Returns the runtime class of this {@code Object}. The returned * {@code Class} object is the object that is locked by {@code * static synchronized} methods of the represented class. */
即:这里取得的是类的运行时名字——定义的类的名字。
所以常常会在执行 System.out.println(一个类对象实例)的时候得到类似 XXX@702d2da4 的结果。
这里定义一个类:
public class Person() { private String name; private int age; private String address; // ... setters & getters }
如果此时使用System.out.println(new Person())方法,会得到如上所述的一个串;但是这往往不是我们所期望的结果。
比如,从常规上来说,我们想要知道一个人的信息,最基本的就是这个人的名字。
那么,我们可以实现toString()方法如下:
@Override public String toString() { return name; }
如果想知道更多的信息,比如还想知道年龄,可以实现toString()方法如下:
@Override public String toString() { return "姓名:" + name + ", 年龄:" + age; }
由此,在必要时通过重写(Override)Object类的toString()方法,以企图让JVM在我们直接输出我们需要得到的对象实例(如:System.out.println(new Person())的信息。