提问人:swimmingsprite 提问时间:4/8/2018 最后编辑:azroswimmingsprite 更新时间:4/8/2018 访问量:407
尝试在超类中创建继承类的新对象时出现 StackOverflowError
StackOverflowError when try create new object of inherit class in superclass
问:
我是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 类继承的,那么一切都很好,但为什么呢?
答:
创建 Instance of 时,将调用 的构造函数,因为 .这称为构造函数链接。Generator
Start
Generators
extends
Start
但是,当您调用 的构造函数时,您也有一个变量称为 new ...start
Generator
你创建一个 that is a 创建一个 that is a ...它一直持续到你的Generator
Start
Generator
Start
stack overflows
Generator
继承自Start
class Generator extends Start
并创建一个 on construction: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
转到 1.
StackOverflow 错误的原因是对象的递归实例化不会终止。递归对象的构造如下。
第 1 步:static Start st = new Start();
步骤 2:由于成员变量 objGenerator 的初始化,实例化 Start 对象需要实例化 Generator 对象。
Generator objGenerator = new Generator();
第 3 步:由于 Generator 是 Start 的子类,因此实例化 Generator 对象需要实例化 Start 对象,这将返回到第 2 步。
因此,实际上,您处于第 2 步和第 3 步之间的无限循环中。达到堆栈限制时,将引发 StackOverflow 异常。
上一个:我的照片没有输出到框架
评论
void generator()