定义一个集合
arraylist al=new arraylist
为什么system.out.println(al)
可以直接打印集合里的数据 而不是地址
我看源码里的是valueof方法 直接去的变量里的内容
您能看到源码,那我们一起跟踪一下。(以下操作均假定在eclipse中)
public void println(Object x) {
String s = String.valueOf(x); //光标移到valueOf上,按F3,进入下一处
synchronized (this) {
print(s);
newLine();
}
}
到这里:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString(); //调用tostring()
}
而ArrayList的toString()继承自 AbstractList,可以象下面这样找:
ArrayList al=new ArrayList(); //光标移到ArrayList上,按F3,进到ArrayList.class文件中。
public class ArrayList<E> extends AbstractList<E> //在ArrayList.class文件头部找到这行,光标移到AbstractList上,按F3,进到AbstractList.class文件中。
然后在AbstractList.class文件中查找toString方法(在文件的底部),它是这样写的:
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
这就是根源所在。
用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢!
在ArrayList里面覆写了Object类的toString方法,输出时会被默认调用
ArrayList是这样的,因为他是实现类并且重写了继承于OBJ的方法