为什么我得到 StackOverflowError

Why do I get StackOverflowError

这是我的 parent class,有两个名为 toString 的方法。带参数的用在child class.

public abstract class Army {
    private String commander;
    private int soldiers;
    private int guns;
    private int horses;
    private int officers;
    // getters & setters
    public Army(){
    }

    @Override
    public String toString() {
        return "Army{" +
                "commander='" + commander + '\'' +
                ", soldiers=" + soldiers +
                ", guns=" + guns +
                ", horses=" + horses +
                ", officers=" + officers +
                '}';
    }

    public String toString(String type) {
        var result = toString();
        return result.replace("Army", type);
    }
}

这是我的 child class,我在 toString 方法中使用 parent class 中的 toString(String type) 方法的 child class:

public class PanzerArmy extends Army {
    private String tanks = "tanks";

    public String getTanks() {
        return tanks;
    }

    public void setTanks(String tanks) {
        this.tanks = tanks;
    }

    @Override
    public String toString() {
        return super.toString("PanzerArmy") +
                " tanks='" + tanks + '\'' +
                '}';
    }
}

当我尝试显示 child class 的 object 时,我收到此错误:

Exception in thread "main" java.lang.WhosebugError

在您的 PanzerArmy.toString() 中,您调用 Army.toString(String),后者又调用 toString()。您可能希望 Army.toString() 在这里执行,但由于您在 PanzerArmy 中覆盖了它(并且当前对象的类型为 PanzerArmy),它将调用 PanzerArmy.toString()。 .. 这将调用 Army.toString(String) 并在永无止境的递归中再次启动整个爵士乐。最终 JDK 决定它受够了这个并放弃了。

更好的解决方案是使 Army 中的 toString() 成为抽象的,而 实现 toString(String).

或者,您可以使用 getClass().getSimpleName() 之类的东西来获取当前 class 的短名称并立即使用它,而不必为每个子[=31= 调整 toString() ].