Java中创建继承类对象触发StackOverflowError的原因咨询
为什么继承Start类会引发StackOverflowError?
嗨,我来给你掰扯清楚这个问题的根源,其实就是类初始化的循环依赖搞的鬼!
先看不继承时为啥正常
当Generator不继承Start的时候,整个初始化流程是顺顺利利的:
- 运行MainClass,首先初始化静态成员
st = new Start(); - 创建Start对象时,初始化它的成员变量
objGenerator = new Generator(); - 因为Generator和Start没有继承关系,创建Generator对象不需要先初始化Start,所以这个过程顺利完成,后续调用
st.start()也能正常执行objGenerator.generator()。
再看继承后为啥炸了
一旦Generator继承了Start,Java的初始化规则就开始“搞事情”了:
- 同样从MainClass初始化静态成员
st = new Start()开始; - 创建Start对象时,要初始化
objGenerator = new Generator(); - 重点来了!Java中创建子类对象时,必须先完成父类的初始化。Generator是Start的子类,所以创建Generator对象前,会先初始化它的父类Start;
- 初始化Start的时候,又要创建它的成员变量
objGenerator = new Generator()——这就回到了步骤3,无限循环下去! - 每次创建对象的过程都会在JVM的栈中留下调用记录,栈的空间是有限的,循环次数多了就会把栈撑爆,直接抛出
StackOverflowError。
给你把关键的循环链标出来:
// 创建Start → 要new Generator() public class Start { Generator objGenerator = new Generator(); // 这里触发Generator的创建 } // Generator继承Start → 创建它必须先初始化Start public class Generator extends Start { void generator() { //... } }
怎么解决?
核心就是打破这个循环依赖:
- 如果Generator不需要继承Start的功能,那直接去掉继承关系(就是你说的正常情况);
- 如果确实需要继承,那不要在Start的成员变量里直接实例化Generator,可以改成懒加载(比如在需要用到的时候再创建),或者通过构造方法传入Generator实例,避免自动触发循环初始化。
内容的提问来源于stack exchange,提问作者swimmingsprite
相关产品推荐
相关产品推荐

