尝试在超类中创建继承类的新对象时出现StackOverflowError

时间:2018-04-07 16:48:40

标签: java stack-overflow

我是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类继承,那么一切正常,但为什么呢?

3 个答案:

答案 0 :(得分:1)

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

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

您创建的Generator Start创建的GeneratorStart ...并且会一直持续到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();
    }
}
  1. Start具有运行objGenerator = new Generator()的构造函数。

  2. 这会调用Generator

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

  5. super()Start的默认构造函数。

  6. 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异常。