尝试在 superclass 中创建继承 class 的新对象时发生 StackOverflowError

StackOverflowError when try create new object of inherit class in superclass

我是 Java 的新手。任何人都可以向我解释为什么它显示 WhosebugError 吗?

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() {
        //...
    }
}

如果生成器class不是继承自class启动,一切正常,但为什么?

创建Generator的实例时,会调用Start的构造函数,因为Generators extends Start。这称为构造函数链接。

但是,当您调用 start 的构造函数时,您还有一个变量调用 new Generator...

你创建了一个 Generator,它是一个 Start,它创建了一个 Generator,它是一个 Start...并且它一直持续到你的 stack overflows

Generator 继承自 Start

class Generator extends Start

并且Start在构造上创建Generator

Generator objGenerator = new Generator();

与下面的相同:

public class Start {

    Generator objGenerator;

    public Start() {
         objGenerator = new Generator();
    }
}

  1. Start 具有运行 objGenerator = new Generator().

  2. 的构造函数
  3. 这会调用 Generator 的构造函数。

  4. Generator 的构造函数做的第一件事是调用 super().

  5. super()Start.

  6. 的默认构造函数
  7. 转到 1.

Whosebug错误的原因是对象的递归实例化没有终止。递归对象实例化如下

第一步:static Start st = new Start();

第二步:实例化Start对象,由于成员变量objGenerator的初始化,需要实例化Generator对象

Generator objGenerator = new Generator();

第三步:由于Generator是Start的子类,所以实例化Generator对象需要实例化Start对象,又回到第二步

因此实际上您处于第 2 步和第 3 步之间来回的无限循环中。达到堆栈限制时,将抛出 Whosebug 异常。