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

StackOverflowError when try create new object of inherit class in superclass

提问人:swimmingsprite 提问时间:4/8/2018 最后编辑:azroswimmingsprite 更新时间:4/8/2018 访问量:407

问:

我是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 类继承的,那么一切都很好,但为什么呢?

Java 堆栈溢出

评论

0赞 SIGSTACKFAULT 4/8/2018
你能给我们看一下代码吗?(或者它是否崩溃了,函数中没有任何内容?我不是专家。void generator()

答:

1赞 Kerry Gougeon 4/8/2018 #1

创建 Instance of 时,将调用 的构造函数,因为 .这称为构造函数链接。GeneratorStartGeneratorsextendsStart

但是,当您调用 的构造函数时,您也有一个变量称为 new ...startGenerator

你创建一个 that is a 创建一个 that is a ...它一直持续到你的GeneratorStartGeneratorStartstack overflows

0赞 Boris the Spider 4/8/2018 #2

Generator继承自Start

class Generator extends Start

并创建一个 on construction:StartGenerator

Generator objGenerator = new Generator();

这与以下内容相同:

public class Start {

    Generator objGenerator;

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

  1. Start具有运行的构造函数。objGenerator = new Generator()

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

  3. 构造函数做的第一件事是调用 。Generatorsuper()

  4. super()是 的缺省构造函数。Start

  5. 转到 1.

0赞 Ananya Krishnaswamy 4/8/2018 #3

StackOverflow 错误的原因是对象的递归实例化不会终止。递归对象的构造如下。

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

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

Generator objGenerator = new Generator();

第 3 步:由于 Generator 是 Start 的子类,因此实例化 Generator 对象需要实例化 Start 对象,这将返回到第 2 步。

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