关于List的toString方法调用的是否是父类Object的,explise显示是的,但其实不是,是AbstractCollection的,他复写了Object的toString
2015-04-20 14:03
597 查看
今天,我打印了下System.out.println(list),想查看下返回什么?
List<String> list=new ArrayList<String>();
list.add("111");
list.add("222");
System.out.println(s);
打印出来:[111, 222]
追查原因:
1、ArrayList是否重写了Object的toString方法:没有
List、Collection、Iterable是否重写了该方法,都没有
2、Object的toString方法打印的方法是什么?
return list.getClass().getName() + "@" + Integer.toHexString(hashCode()) 这个是Object的toString方法的代码
修改之后打印出来java.util.ArrayList@17c9c2,不符合结果[111, 222]
3、继续查找System.out.println()中的println方法
println方法
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
String s = String.valueOf(x);
中s的结果是[111, 222]
所以,查看String.valueOf(x)方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
4、继续跟踪obj.toString()方法,发现调用的是Object的toString()方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
这个方法打印出来的结果[111, 222]跟这个肯定不是一个结果
这个结果跟前面打印出来的结果不符。。。
5、于是郁闷了很久很久。。。。此处省略10000个字。。。发现结果不符。。继续查看
6、终于发现新大陆了,原来list.toString()的toString方法调用的是类java.util.AbstractCollection;中的toString方法
源码如下:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
一切都明白了。。
List<String> list=new ArrayList<String>();
list.add("111");
list.add("222");
System.out.println(s);
打印出来:[111, 222]
追查原因:
1、ArrayList是否重写了Object的toString方法:没有
List、Collection、Iterable是否重写了该方法,都没有
2、Object的toString方法打印的方法是什么?
return list.getClass().getName() + "@" + Integer.toHexString(hashCode()) 这个是Object的toString方法的代码
修改之后打印出来java.util.ArrayList@17c9c2,不符合结果[111, 222]
3、继续查找System.out.println()中的println方法
println方法
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
String s = String.valueOf(x);
中s的结果是[111, 222]
所以,查看String.valueOf(x)方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
4、继续跟踪obj.toString()方法,发现调用的是Object的toString()方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
这个方法打印出来的结果[111, 222]跟这个肯定不是一个结果
这个结果跟前面打印出来的结果不符。。。
5、于是郁闷了很久很久。。。。此处省略10000个字。。。发现结果不符。。继续查看
6、终于发现新大陆了,原来list.toString()的toString方法调用的是类java.util.AbstractCollection;中的toString方法
源码如下:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
一切都明白了。。
相关文章推荐
- List的toString方法调用的是否是父类Object的?
- 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址
- 原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法
- java 关于对“是否可以从一个static方法内部发出对非static方法的调用”问题的理解
- 关于Spring JdbcTemplate调用queryForObject()方法结果集为空时报异常的解决办法
- 复写Object超类的equals,hashCode,toString方法
- 关于自定义异常中为什么带参构造器需要显示调用父类异常的带参构造器
- HttpURLConnection中connect()方法是否要显示调用及openConnection()方法源码探究
- Objective C类方法load和initialize(关于它们的执行时环境与load调用对父类initialize方法的影响)
- 请使用LinkedList来模拟一个队列(先进先出的特性): 1) 拥有放入对象的方法void put(Object o) 2)取出对象的方法Object get() 3)判断队列当中是否为空的方法b
- JS会自动调用toString()方法来显示日期(即“Date对象的内容”)
- 关于QWidget的子类调用show()方法不能显示的问题
- 关于C++中子类调用父类方法的一个问题
- Java之Object构造方法(创建子类对父类构造方法的调用)
- 关于子类和父类之间的方法,构造方法调用关系
- 关于自动调用toString方法
- 关于调用Dialog的复写的show()方法出现空指针的问题
- 关于加@Transactional注解的方法之间调用,事务是否生效的问题
- 关于List接口的remove(Object o)方法的对象与下标区分
- List调用toString()方法后,去除两头的中括号