首先有这样一个问题:
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
System.out.println(list);
那么这样打印的结果会是什么那?
[zhangsan, lisi]
那么问题来了,‘[]’是从哪里来的那?
我们知道,所有的对象在重写了Object类的toString()方法之后,才会输出对象的信息。否则输出的则是类似cn.edu.lnu.test.Box@15db9742这种东西,这是什么?是类的‘全类名@hashcode’,我们来看看Object的源码:
package java.lang;
/**
* Class {@code Object} is the root of the class hierarchy.
* Every class has {@code Object} as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* @author unascribed
* @see java.lang.Class
* @since JDK1.0
*/
public class Object {
public native int hashCode();
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
}
由此,我们可以得出结论,自定义的类只有重写了Object的toString()方法才会打印出对象的内容。
所以我们猜想:List接口肯定重写了Object的toString();兴致冲冲地去看了源码,发现:
并没有!!!
那究竟是怎么回事那?
看看java中集合的关系就知道了,上图:
原来是AbstractCollection重写了toString()方法!至此,所有的迷雾揭开了!