子类的构造函数中的堆栈溢出错误

时间:2018-09-29 22:16:17

标签: java inheritance stack-overflow

我的超类是:

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”可能存在问题。但是删除它仍然会在运行时导致错误。我觉得它们是我的子类构造函数中代码结构的问题,但我不确定到底是什么。我尝试使用原始变量在更高的位置创建对象,但无济于事。

有帮助吗?

2 个答案:

答案 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);这一行放在构造函数之外,当您将该行放入构造函数时,您正在创建很多对象。