Java源代码阅读-Object.toString()

关于Object中的toString()


先来看一个简单的基类 Parent,它有一个toString()方法

public class Parent{
	
	public String toString(){
		return "Parent";
	}
}

然后you一个派生类Child继承Parent,它重载了基类ParenttoString().

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()方法分别打印 thisnew Child().它们都是调用了ChildtoString()方法,所以输出结果相同.

如果注释掉Child派生类的toString()方法,再执行main方法之后,输入结果如下:

Parent
Parent

此时Child通过 new 调用 get()方法分别打印 thisnew Child().它们都是调用了ParenttoString()方法.

再做进一步的测试,注释掉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()));.

从以上简单的测试中可以看到,如果想直接打印一个类型的实例时,实际上这个实例调用的ObjecttoString()方法.

此时,我又在想为什么打印一个类型的实例时,会调用toString()方法呢?

原文地址:https://www.cnblogs.com/baininghan/p/3876290.html