防止重载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方法才能返回正确的结果。

时间: 2024-08-04 08:07:00

防止重载toString时产生递归调用的方法的相关文章

ios uinavigation-系统的UINavigationController滑动返回时,会调用哪个方法?

问题描述 系统的UINavigationController滑动返回时,会调用哪个方法? 从iOS7以后,支持手势返回,当手势返回时,会调用哪个方法? 解决方案 UINavigationController 的 - (UIViewController *)popViewControllerAnimated:(BOOL)animated 方法,还有 委托方法 (void)navigationController:(UINavigationController *)navigationControl

【百度地图API】当地址解析失败时,如何调用search方法查找地址

原文:[百度地图API]当地址解析失败时,如何调用search方法查找地址 有个朋友问我,当地址解析失败时,应该如何处理呢?比如,他想搜索"南宁市青秀区". ----------------------------------------------------------------------------- 首先,我们需要弄明白,地址解析的原理: 使用Geocoder进行地址解析,比如"北京市海淀区上地10街",当系统匹配到这个地址时,getPoint就会返回一

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

本文为原创,如需转载,请注明作者和出处,谢谢!     在Java中任何对象都继承于Object类,因此,每个类都有一个toString方法用于返回当前对象的字符串形式(可能是对象地址或其他和对象相关的信息).在每个类中也可以覆盖toString方法以返回自定义的字符串.如下面的代码将以一定的格式返回对象的地址: package string; public class InfiniteRecursion {     public String toString()     {         

C++函数的嵌套调用和递归调用学习教程_C 语言

C++函数的嵌套调用 C++不允许对函数作嵌套定义,也就是说在一个函数中不能完整地包含另一个函数.在一个程序中每一个函数的定义都是互相平行和独立的. 虽然C++不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数. 在程序中实现函数嵌套调用时,需要注意的是:在调用函数之前,需要对每一个被调用的函数作声明(除非定义在前,调用在后). [例]用弦截法求方程f(x)=x3-5x2+16x-80=0的根. 这是一个数值求解问题,需要先分析用弦截法求根的算法.根据数学知

关于递归调用的写法,遇到死循环吗,请教大家

问题描述 private String queryOrgDn(String parentid,String dn){System.out.println("parentid : " +parentid);int len = parentid.trim().length();while(len > 5) {AndFilter filter = new AndFilter();filter.and(new EqualsFilter("objectclass",&q

前台页面如何多次调用后台方法

问题描述 前台页面:<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default2.aspx.cs"Inherits="Default2"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xh

JavaScript在IE中“意外地调用了方法或属性访问”_javascript技巧

同样一段代码,两次调用,一次通过,一次异常: function clearSelect(obj){ if(obj && obj.options) obj.options.length=0; } 以下是前人的一些经验: 这是两个经典异常,不知道原理的话很难定位.从下面的代码中可用看到发生的条件 <iframe src="javascript:'<script>top.ff1={abc:function(){}}<\/script>'" wid

PHP递归调用的小技巧讲解

在PHP的实际编码中,当我们需要实现多元数组替换功能时,就会遇到PHP递归调用.那么具体的使用方式是怎样的呢?下面我们将通过一段代码示例来具体分析一下实现这以功能的方法. PHP递归调用实现多元数组替换功能代码示例: < ?php $arr = array(array("< 小刚>","< 小晓>"),"< 小飞>","< 小李>","< 小红>&qu

asp.net-asp. net 前台调用后台的一个方法,点击按扭时如何调用呢,调用如下方法

问题描述 asp. net 前台调用后台的一个方法,点击按扭时如何调用呢,调用如下方法 void test() { char[] constant = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; StringBuilder ascii = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 6; i++) { ascii.Append(cons