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

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

有帮助吗?

Car*_*ate 5

你写的时候在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 ......