关于Object中的toString()
先来看一个简单的基类 Parent,它有一个toString()
方法
public class Parent{
public String toString(){
return "Parent";
}
}
然后you一个派生类Child继承Parent,它重载了基类Parent的toString()
.
public class Child{
public String toString(){
reuturn "Child";
}
public void get(){
System.out.println(this);
System.out.println(new Child());
}
public static void main(String[] args){
new Child().get();
}
}
然后执行Child的main方法得到结果如下:
Child
Child
Child通过 new 调用 get()
方法分别打印 this
和 new Child()
.它们都是调用了Child的toString()
方法,所以输出结果相同.
如果注释掉Child派生类的toString()
方法,再执行main方法之后,输入结果如下:
Parent
Parent
此时Child通过 new 调用 get()
方法分别打印 this
和 new Child()
.它们都是调用了Parent的toString()
方法.
再做进一步的测试,注释掉Parent基类的toString()
方法.查看输出结果如下:
com.B@15db9742
com.B@6d06d69c
这些又是从哪里来的呢?我们知道Java所有类都有一个总基类就是Object,查看源代码之后我们在Object中找到如下toString()
方法.
//注释省略
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
从源代码中我们可以得到打印结果的组成方式.由类型的完整相对路径加@符号再加上一段通过Integer.toHexString()
处理哈希玛hashCode()
得到的一组字符串组成.实际打印语句可以看成是:
System.out.println(new B().getClass().getName() + "@" + Integer.toHexString(new B().hashCode()));
.
从以上简单的测试中可以看到,如果想直接打印一个类型的实例时,实际上这个实例调用的Object的toString()
方法.
此时,我又在想为什么打印一个类型的实例时,会调用toString()
方法呢?