一个很容易被忽略的东西----toString()

    为什么当我们用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玩弄啊。我们相信眼球,相信自己看到的。说了这么多,怎么样?不敲几行看看吗?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值