Java笔记 – toString方法 无意识的递归
本文由发表于4年前 | J2EE | 暂无评论 |  被围观 3,079 views+
1、toString()方法:2、容器类的toString()方法:3、无意识的递归:解决方法:
一个类继承了Object的toString()方法,并重写了toString()方法,然后在toString中使用了this造成了无意识的递归。
1、toString()方法:

我们知道, 每一个类都是继承自Object的,所以都继承了Object的toString()方法, 打印一个对象的时候,会调用其toString()方法,默认的toString是打印该对象的内存地址。

2、容器类的toString()方法:

容器类也都有toString()方法,并且覆盖了该方法,使得它生成的String结果能够表达容器自身,以及容器所包含的对象,ArrayList.toSting()方法是这样的:遍历ArrayList中的所有对象,调用每个元素上的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(", ");
    }
    }

看下这段代码

public class ToString {
    public static void main(String[] args){
        User user1 = new User("Jason", "123");
        User user2 = new User("arthinking", "123");
        ArrayList<User> users = new ArrayList<User>();
        users.add(user1);
        users.add(user2);
        System.out.println(users);
    }
}

class User {
    private String name;
    private String id;
    public User(String name, String id){
        this.name = name;
        this.id = id;
    }
}

得到的结果为:

[com.itzhai.test.User@6e1408, com.itzhai.test.User@e53108]

如结果所示,按照ArrayList的toString()方法实现,打印出了每一个元素。我们再重写下User类的toString()方法:

@Override
public String toString() {
    return this.name + ":" + this.id;
}

执行结果,每一个User元素也会调用其toString()方法:

[Jason:123, arthinking:123]
3、无意识的递归:

现在修改下程序,把User的toString()方法改为如下:

@Override
public String toString() {
    return "address: " + this;
}

再次执行程序,会得到如下的异常:

Exception in thread "main" java.lang.StackOverflowError
 at java.lang.AbstractStringBuilder.<init>(Unknown Source)
 at java.lang.StringBuilder.<init>(Unknown Source)
 at com.itzhai.test.User.toString(ToString.java:31)
 at java.lang.String.valueOf(Unknown Source)
 at java.lang.StringBuilder.append(Unknown Source)

这是递归调用出现的错误导致的。当我们使用"+"连接"address"和this时,编译器试着将this转换成一个String,这种转换直接调用了this上的toString方法,于是出现了递归调用。

解决方法:

其实解决方法也很简单,就是通过super.toString()显示的去调用父类的toString()方法,从而避免编译器调用了

@Override
public String toString() {
    return "address: " + super.toString();
}

得到如下结果:

[address: com.itzhai.test.User@6e1408, address: com.itzhai.test.User@e53108]
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/java-notes-tostring-method-unconscious-recursion.html
关键字: ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2013 12/13
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    没有评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 Python语法笔记2 2014/3/9
2 汇编cmp指令和条件转移指令实现高级语言中的IF语句功能 2011/4/18
3 JVM笔记 – 虚拟机执行子系统(虚拟机类加载机制) 2014/12/8
4 从一笔交易说起,如何处理好数据的一致性问题 2016/6/14
5 【TODO】几个海量查找和去重的问题 2014/6/15
6 Strut2中Filter过滤器的编写和注册 2011/9/16
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.