我是Java的新手。任何人都可以向我解释为什么它显示StackOverflowError?
public class MainClass {
static Start st = new Start();
public static void main(String[] args) {
st.start();
}
}
public class Start {
Generator objGenerator = new Generator();
void start() {
objGenerator.generator();
}
}
public class Generator extends Start {
void generator() {
//...
}
}
如果Generator类没有从Start类继承,那么一切正常,但为什么呢?
答案 0 :(得分:1)
当创建Generator
实例时,会调用Start
的构造函数,因为Generators
extends
Start
。这称为构造函数链接。
但是,当您调用start
的构造函数时,您还有一个调用new Generator
的变量...
您创建的Generator
Start
创建的Generator
是Start
...并且会一直持续到stack overflows
< / p>
答案 1 :(得分:0)
Generator
继承自Start
class Generator extends Start
Start
在构造上创建Generator
:
Generator objGenerator = new Generator();
与以下内容相同:
public class Start {
Generator objGenerator;
public Start() {
objGenerator = new Generator();
}
}
Start
具有运行objGenerator = new Generator()
的构造函数。
这会调用Generator
。
Generator
的构造函数所做的第一件事就是调用super()
。
super()
是Start
的默认构造函数。
GOTO 1。
答案 2 :(得分:0)
StackOverflow错误的原因是因为对象的递归实例化不会终止。递归对象的实例化如下。
步骤1:静态启动st = new Start();
步骤2:由于成员变量objGenerator的初始化,实例化Start对象需要实例化Generator对象。
Generator objGenerator = new Generator();
步骤3:由于Generator是Start的子类,因此实例化Generator对象需要实例化Start对象,这将返回到步骤2.
所以实际上你处于第2步和第3步之间来回的无限循环。一旦达到堆栈限制,就会抛出StackOverflow异常。