为什么当我们用System.out.println(something)方法,有时候打印的是我们需要的数据,有时候打印出来的却是一大堆的特殊符号,也就是我们所谓的内存地址。这是什么原因导致的呢?
首先我们要搞清一个问题,上面这句话默认打印的就是something.toString()的值。这点没问题吧?如果这点你明白了,ok继续往下看,如果这点还不是很明白,希望你马上看看java的基础,别再耽误了。
我们都知道,java是单继承的,他不支持多重继承。所有的类的抽象类向上最后是Object,也就是说,Object是所有类的父类。所有的类都是从Object向下衍化派生出来的。Object中就有一个方法toString()。希望条件允许的话都应该看看JDK源代码,很长见识的。下面的代码就是Object类的toString()方法的源码。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
看到否?这个方法的返回值就是类名+我们所谓的那一大堆地址代码。其实后面返回的是这个对象的散列码的一种表现形式。具体的就不用说了,因为这不属于这个问题的探讨范围,我们知道这个方法就好。
众所周知,java的子类可以覆盖父类的方法,如果子类的方法和父类的方法名一样,那么当调用这个方法的时候,就不会调用父类的方法了。所以... ...
我们看下下面的2个例子就一切都明白了。
例子1:
String str1 = "abc";
System.out.println(str1.toString);//其实等同于System.out.println(str1);为了说明问题
再来看看String类的toString()方法的源代码:
public String toString() {
return this;
}
哦,他没有用Object的那个toString()方法,而是覆盖改写了那个方法。
例子2:
Set l = new HashSet();
System.out.println(l.toString());
当我们按住control点击toString()方法的时候,得到的链接是Object.class的源代码。我们看到的还是那个方法。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
也就是说,这个类没有覆盖Object的toString()的方法,所以我们调用这个方法的时候还是调用Object中的toString()方法,也即返回的就是那所谓的一大堆的内存地址了。
一切搞清了吗?如果打印一个对象的时候我们没有看到那一大堆内存地址,ok。那一定是这个类重写了toString()的方法。问题就是这么简单。不要被JVM玩弄啊。我们相信眼球,相信自己看到的。说了这么多,怎么样?不敲几行看看吗?
一个很容易被忽略的东西----toString()
最新推荐文章于 2024-02-19 22:30:02 发布