Java笔记 – toString方法 无意识的递归
本文由发表于4年前 | J2EE | 暂无评论 |  被围观 3,087 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 Android开发在Eclipse环境中无法显示提示信息This element neither has attached source nor attached Javadoc 2011/7/15
2 Struts2的一个和多个文件上传的实现 2011/5/8
3 Java笔记 – String类的常用方法 2013/12/18
4 Java基础笔记 – 通过反射机制动态创建和访问数组 2011/10/8
5 Android中的常用控件之ExpandableListActivity SimpleExpandableListAdapter RatingBar SeekBar 2011/7/13
6 Tips:ItzDesktop使用技巧 2012/6/10
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

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

联系我们:admin@itzhai.com

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