有些同学会有一些疑问,Object类对象打印时,控制台输出的是首地址,但为什么用加强型for循环遍历List集合时,打印出来的是数据.有些同学可能对什么时候打印的是首地址,什么时候能打印出数据很懵,这篇文章,我会讲解一下.
定义一个Object对象,打印一下,看看控制台输出的是什么
Object obj=new Object(); System.out.println(obj); //System.out.println(obj.toString()); 当打印对象时,默认会调用Object类的toString,可以省略不写.和上一行的效果是一样的
这个时候打印出的是首地址,因为Object类的toString方法定义的就是打印首地址,我们可以按Ctrl+点击toString 进入Object的源码中看一下Object类的toString方法
在Object类的源码中我们可以看到Object类的toString方法中,返回的是hashCode哈希码,就可以理解为数据的存储位置.
在来看一下String类的toString方法
String s="abc"; System.out.println(s.toString());
String类的toString方法打印的是数据 ,因为 String类的源码中的toString方法返回的是数据本身.
,可以ctrl+鼠标点一下查看一下toString方法
当List集合存放字符串类型的数据时,打印时,控制台输出的是字符串
List list =new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list1);
用加强型for循环遍历一下,list集合向上转为Object对象看看效果:
for (Object ob:list){ System.out.println(ob.toString()); }
打印出来的也是具体数据,而不是地址.这个时候有同学可能会问,为什么list集合向上转型为Object后,怎么不是打印的地址,而是数据.
因为list集合添加的是String字符串类型,向上转为Object类后toString方法使用的是String类重写后的toString方法 ,所以打印的是值.
Object类是所有类的根类。它位于java.lang包中,是所有类的父类,因此所有的Java类都直接或间接地继承自Object类。所以String字符串类型,向上转为Object类后toString方法使用的是String类重写后的toString方法.