`
seara
  • 浏览: 654926 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

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

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


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packagestring;

publicclassInfiniteRecursion
{
publicStringtoString()
{
return"address:"+this;
}
publicstaticvoidmain(String[]args)
{
System.out.println(
newInfiniteRecursion().toString());
}
}

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


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicStringtoString()
{
return"address:"+super.toString();
}

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


国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    Java基础笔记需要的可以看看.docx

    10. **形参与实参**:形参是方法声明时的参数,实参是调用方法时传入的实际值。 11. **重写与重载**:重写(Override)发生在子类中,方法名、参数列表和返回类型必须与父类一致,访问修饰符不能更严格。重载...

    Java面试题以及答案

    写clone()方法时,通常都有一行代码,是什么? - 通常会有一行`super.clone();`代码,这是为了调用父类的`clone()`方法。 #### 43. JAVA语言如何进行异常处理,关键字:throws, throw, try, catch, finally分别...

    java面试题(尚学堂内部培训资源,绝对值得一看)

    写clone()方法时,通常都有一行代码,是什么? 这行代码通常是`super.clone();`,用于调用父类的`clone()`方法,完成浅复制的基础工作。 #### 43. JAVA语言如何进行异常处理? 使用`try-catch-finally`结构捕获...

    .NET面试题

    子类中的方法必须使用`override`关键字来指定此方法是要重写父类中的方法。 #### 七、B/S架构中的变量传递 除了常见的Session、Cookie、Application等方法外,还可以考虑使用隐藏字段(Hidden Field)、URL重写...

    ASP.NET面试题大全.doc

    - `override`(Overriding)用于子类中,覆盖基类中的虚方法,保持方法签名一致,目的是实现多态性。 6. B/S结构中传递变量值的其他方式: - View State:存储控件的状态信息,不适用于跨页面传递。 - Hidden ...

    Java实验报告中的实验题.doc (2).pdf

    2. **覆盖方法**:子类可以覆盖父类的方法,提供不同的实现,如`@Override public String toString() {...}`。 3. **多态性**:不同对象可以调用相同的重写方法,但执行不同的行为,体现对象的多态特性。 实验五...

    java统计文件夹大小

    `walkFileTree`会递归地遍历指定的目录,并对每个文件或目录调用一个`FileVisitor`实例。我们可以通过实现`FileVisitor`接口来定制我们的文件访问行为。 ```java import java.io.IOException; import java.nio.file...

    android开发中如何实现sdcard扫描

    2. 如果是目录,递归调用`readFile`方法,传入当前目录的子文件数组,以继续扫描。 ```java private void readFile(final File[] file) { if (file != null) { for (int i = 0; i ; i++) { if (file[i].isFile()...

    c# 笔试面试题以及答案

    - **Override**: 在面向对象编程中,Override 用于覆盖基类中的虚方法。子类可以通过 Override 关键字重新定义父类的行为,以便于提供更具体或定制化的实现。 - **重载**: 重载是在同一个类中定义多个同名方法,但...

    asp.net面试题目

    - **Override**: 用于覆盖基类中的虚方法或抽象方法。这使得派生类能够提供自己的实现,从而改变继承行为。 - **重载**: 同一个方法名,但参数列表不同(包括参数的数量、类型或顺序)。这是一种多态的形式,可以...

    C#,asp.net面试题

    重写时必须完全匹配父类方法的签名,且访问修饰符不能更严格。 ### ASP.NET页面之间的值传递 ASP.NET提供了多种方式在不同页面间传递数据: - **Post方式**:使用`Request.Params`获取页面表单数据。 - **Get方式*...

    .net常见面试题

    **解析**:在这个例子中,当创建 `B` 类的新实例时,会先调用基类 `A` 的构造函数,然后调用 `PrintFields` 方法。由于 `B` 类覆盖了该方法,因此输出将是 `x=1, y=-1`。 #### 13. 应用程序域的概念 **题目**:...

    java实验所有代码

    在`Student.java`文件中定义学生类,包括学号、班级、姓名、年龄等属性,并实现获取这些属性的方法以及`toString`方法。 ```java package cn.swust.edu.student; public class Student { int studentNumber, age;...

    有关.net的面试题

    - `override`(Overriding)发生在派生类中,用于覆盖基类中的虚方法,以实现多态性。 6. 不使用Session、Cookie、Application传递变量值: - 可以使用隐藏字段、视图状态(ViewState)、查询字符串(QueryString...

    Java面试题整理精华

    写clone()方法时,通常都有一行代码,是什么? 通常会包含一行`super.clone()`,这是因为`clone()`方法是在`Object`类中定义的,需要调用基类的`clone()`方法来完成复制操作。 #### 43. JAVA语言如何进行异常处理...

    net学习笔记及其他代码应用

    29.根据线程安全的相关知识,分析以下代码,当调用test方法时i&gt;10时是否会引起死锁?并简要说明理由。 public void test(int i) { lock(this) { if (i&gt;10) { i--; test(i); } } } 答:不会发生死锁,(但...

    java初级知识

    - **参数列表**:方法调用时传递的信息。 - **返回类型**:方法执行后返回给调用者的结果类型。 - **方法体**:包含实际执行的代码。 **4. 方法特点** - 方法可以没有参数,也可以没有返回值。 - 方法可以重载...

    面试时可能遇到的题

    - `override`(Overriding)用于子类中覆盖父类的方法,提供更具体的实现,需在父类方法上有`virtual`或`abstract`修饰。 6. 在B/S系统中不使用Session、Cookie、Application传递变量: - 使用隐藏字段...

    Java领域基础部分JavaSE笔记

    - **作用**:防止修改、禁止覆盖或重写。 ##### 8.6 抽象类 - **定义**:不能被实例化的类。 - **特点**:可以包含抽象方法和具体方法。 ##### 8.7 接口 - **定义**:一组抽象方法的集合。 - **实现**:使用`...

Global site tag (gtag.js) - Google Analytics