skt*_*sus 1 java stack-overflow inheritance
我的超级课程是:
public abstract class MarketProduct {
private String name;
public MarketProduct(String productName) {
name = productName;
}
public final String getName() {
return this.name;
}
public abstract int getCost();
public abstract boolean equals(Object o);
}
Run Code Online (Sandbox Code Playgroud)
而我的子类(直到它的构造函数)是:
public class Egg extends MarketProduct {
private int numEggs;
private int priceEggs;
public Egg(String productName, int numRequired, int priceEggsDozen) {
super(productName);
numEggs = numRequired;
priceEggs = priceEggsDozen;
MarketProduct marketProductEgg = new Egg(productName, numEggs, priceEggs);
}
Run Code Online (Sandbox Code Playgroud)
我在Egg.init(Egg.java:9)得到一个java.lang.StackOverflowError.在这种情况下,第9行是子类中构造函数的最后一行,即:
MarketProduct marketProductEgg = new Egg(productName, numEggs, priceEggs);
Run Code Online (Sandbox Code Playgroud)
我知道当递归方法不断调用时会出现堆栈溢出错误.所以我认为在超类的getName方法中可能存在"this"的问题.但是删除它仍然会在运行时导致错误.我觉得他们的子类构造函数中的代码结构存在问题,但我不确定究竟是什么.我试图用原始变量创建更高的对象,但无济于事.
有帮助吗?
你写的时候在Egg构造函数中创建了一个新的Egg
MarketProduct marketProductEgg = new Egg(productName, numEggs, priceEggs);
Run Code Online (Sandbox Code Playgroud)
这意味着每次制作一个Egg时,构造函数都会运行,然后在构造函数中创建一个新的egg,这会导致构造函数再次运行并创建一个新的egg,然后构造函数再次运行,这会导致一个新的egg创建,然后构造函数再次运行...
你在这里看到了重点.每次创建一个鸡蛋时,都会创建另一个鸡蛋,直到你有无限的鸡蛋(或者你的堆积空间不足,导致a StackOverflowError).
既然你从不使用marketProductEgg,只需从构造函数中删除它.
并且为了证明这与子类化无关,请使用此类:
class A {
A() {
A(); // Creates a new A in the constructor of A
}
}
Run Code Online (Sandbox Code Playgroud)
并尝试创建它的实例.每个A创建另一个A,创建另一个A,创建另一个A ......