随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0

导航

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

公告

关注我的新浪微博

我的著作









常用链接

留言簿(126)

我参与的团队

随笔分类(818)

随笔档案(310)

文章分类(1)

文章档案(8)

相册

ADSL、3G查询

CSDN

eclipse

ibm

Java EE

Linux

Web

云服务

代理网站

关注的网站

协议

喜欢的Blog

国内广告平台

图书出版

在线培训

开发工具

微博客户端

手机铃声

操作系统

  • ReactOS
  • 一个与windowXP/2003兼容的操作系统

数学

文件格式

源码资源

移动(Mobile)

编程语言

英语学习

最新随笔

搜索

  •  

积分与排名

  • 积分 - 1969740
  • 排名 - 6

最新评论

阅读排行榜

评论排行榜

如何防止覆盖(override)toString方法时产生递归调用

本文为原创,如需转载,请注明作者和出处,谢谢!

    在Java中任何对象都继承于Object类,因此,每个类都有一个toString方法用于返回当前对象的字符串形式(可能是对象地址或其他和对象相关的信息)。在每个类中也可以覆盖toString方法以返回自定义的字符串。如下面的代码将以一定的格式返回对象的地址:


package string;

public class InfiniteRecursion
{
    
public String toString()
    {
        
return "address:" + this;
    }
    
public static void main(String[] args)
    {
        System.out.println(
new InfiniteRecursion().toString());
    }
}

如果运行上面的程序,将抛出StackOverflowError异常,这说明程序的工作栈溢出了。导致这种情况最常见的错误就是无限递归。这们发现在toString中使用this来返回对象的地址,如果这样调用,将会无限调用InfiniteRecursion类的toString方法。如果要避免这种情况的出现,要将toString改成如下的形式:


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

    也就是说,不能再调用当前类的toString方法,必须调用当前类父类的toString方法才能返回正确的结果。




Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2008-05-07 16:07 银河使者 阅读(1982) 评论(7)  编辑  收藏 所属分类: java 原创

评论

# re: 如何防止重载toString方法时产生递归调用  回复  更多评论   

我想,标题有误吧,“重载”应改为“重写”。
重载与重写是不一样的!
2008-05-07 22:52 | dotnetMac

# re: 如何防止重载toString方法时产生递归调用  回复  更多评论   

System.out.println(new InfiniteRecursion()) is good enough.
2008-05-08 04:15 | Wendong

# re: 如何防止覆盖(override)toString方法时产生递归调用  回复  更多评论   

没错,是覆盖或重写(override),已经改过来了!
2008-05-08 08:48 | 银河使者

# re: 如何防止覆盖(override)toString方法时产生递归调用  回复  更多评论   

可能是对重载印象较深,哈哈,内容全都是覆盖。
2008-05-08 08:49 | 银河使者

# re: 如何防止覆盖(override)toString方法时产生递归调用  回复  更多评论   

另外System.out.println(new InfiniteRecursion());和 System.out.println(new InfiniteRecursion().toString());是完全一样的,都会抛出java.lang.StackOverflowError异常
2008-05-08 09:11 | 银河使者

# re: 如何防止覆盖(override)toString方法时产生递归调用  回复  更多评论   

谁会这样重写toString呢,我们知道,如果用户没有覆盖toString拿直接print
this 就默认调用toString方法啊
2008-05-08 12:03 | 爱上对方

# re: 如何防止覆盖(override)toString方法时产生递归调用  回复  更多评论   

本文只是个引子,虽然标签是toString方法,但我们可以引申到其他的任何方法。
2008-05-08 12:09 | 银河使者

只有注册用户登录后才能发表评论。


网站导航: