为什么我得到 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()
].
这是我的 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()
].