Java 无意识递归

之前在练习中碰到一个问题,程序中没有使用递归却出现了 Exception in thread “main” java.lang.StackOverflowError 异常,先把之前的代码贴上来:

public class InfiniteRecursion {
    public String toString() {
        return "InfiniteRecursion address" + this + "\n";
    }

    public static void main(String[] args) {
        InfiniteRecursion infiniteRecursion = new InfiniteRecursion();
        System.out.println(infiniteRecursion.toString());
    }
}

程序希望打印出 InfiniteRecursion address+“类内存地址”的格式,结果却出现了异常,分析一下为什么会出现这种情况:

首先,toString中this要跟前面的字符串连接,会进行自动类型转换,也就是要调用该类的toString方法,而该类重写了父类Object的toString
方法,所以就会直接调用该类的toString方法,结果每一次调用toString都会引发继续调用toString方法的逻辑,即无意识递归,导致出现 StackOverflowError 异常,所以如果想在toString 中打印类内存地址,可以通过super关键字直接调用父类的方法,即Object.toString(),修改后的代码如下:

public class InfiniteRecursion {
    public String toString() {
        return "InfiniteRecursion address" + super.toString() + "\n";
    }

    public static void main(String[] args) {
        InfiniteRecursion infiniteRecursion = new InfiniteRecursion();
        System.out.println(infiniteRecursion.toString());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值