You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中创建继承类对象触发StackOverflowError的原因咨询

为什么继承Start类会引发StackOverflowError?

嗨,我来给你掰扯清楚这个问题的根源,其实就是类初始化的循环依赖搞的鬼!

先看不继承时为啥正常

当Generator不继承Start的时候,整个初始化流程是顺顺利利的:

  1. 运行MainClass,首先初始化静态成员st = new Start();
  2. 创建Start对象时,初始化它的成员变量objGenerator = new Generator();
  3. 因为Generator和Start没有继承关系,创建Generator对象不需要先初始化Start,所以这个过程顺利完成,后续调用st.start()也能正常执行objGenerator.generator()。

再看继承后为啥炸了

一旦Generator继承了Start,Java的初始化规则就开始“搞事情”了:

  1. 同样从MainClass初始化静态成员st = new Start()开始;
  2. 创建Start对象时,要初始化objGenerator = new Generator();
  3. 重点来了!Java中创建子类对象时,必须先完成父类的初始化。Generator是Start的子类,所以创建Generator对象前,会先初始化它的父类Start;
  4. 初始化Start的时候,又要创建它的成员变量objGenerator = new Generator()——这就回到了步骤3,无限循环下去!
  5. 每次创建对象的过程都会在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:48:46