我的超类是:
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);
}
我的子类(直到其构造函数)是:
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);
}
我在Egg.init(Egg.java:9)处收到java.lang.StackOverflowError。在这种情况下,第9行是子类中构造函数的最后一行,即:
MarketProduct marketProductEgg = new Egg(productName, numEggs, priceEggs);
我了解到,递归方法不断被调用时,会出现堆栈oveflow错误。因此,我认为超类的getName方法中的“ this”可能存在问题。但是删除它仍然会在运行时导致错误。我觉得它们是我的子类构造函数中代码结构的问题,但我不确定到底是什么。我尝试使用原始变量在更高的位置创建对象,但无济于事。
有帮助吗?
答案 0 :(得分:5)
您在编写时在Egg构造函数中创建一个新Egg
MarketProduct marketProductEgg = new Egg(productName, numEggs, priceEggs);
这意味着每次创建一个Egg时,构造函数都会运行,然后在构造函数中创建一个新的Egg,这会使构造函数再次运行并创建一个新的Egg,然后构造函数再次运行,从而导致一个新的要创建的鸡蛋,然后构造函数再次运行...
您在这里看到了重点。每次创建一个鸡蛋时,都会创建另一个鸡蛋,直到您有无限个鸡蛋(或者堆栈空间用完,导致StackOverflowError
)。
由于您从不使用marketProductEgg
,因此只需从构造函数中删除它即可。
为了证明这与子类化无关,请采用此类:
class A {
A() {
A(); // Creates a new A in the constructor of A
}
}
并尝试创建它的实例。每个A都会创建一个A,另一个A会创建另一个A ...
答案 1 :(得分:0)
正如@Lucio所提到的,将MarketProduct marketProductEgg = new Egg(productName, numEggs, priceEggs);
这一行放在构造函数之外,当您将该行放入构造函数时,您正在创建很多对象。