从超类调用子类构造函数

时间:2016-01-31 01:34:39

标签: java inheritance constructor

我第一次遇到java中的继承而且构造函数存在问题。

考虑A类

class A{
    ...(Constructor) {
        ...
        ObjectCreatedBySubClass= new B();
        }
    ...(etc)


    protected static B    ObjectCreatedBySubClass;    
}

及其子类

class B extends A{
    B(){
    ..(No matter what code I put here, it does not work.)
    }


    ...(Instance variables)
}

无论我改变什么,每次我都

Exception in thread "main" java.lang.StackOverflowError
at A.<init>
at B.<init>
(repeat about 100 times)

我的教授解释说我不应该&#34;延伸&#34; a&#34; has-a&#34;关系,就像这里的情况一样。我将使用组合而不是继承来解决我的问题,但我的问题是

我不明白为什么会出现这个问题。由于(我假设)某种无限循环,它耗尽了内存,但我不知道为什么。 在这种情况下,我如何正确使用继承?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

由于B扩展了A,每次调用B的构造函数时,你也会调用A。但是,在A的构造函数的实现中,实例化一个B,在它的构造上,它调用A的构造函数。这种循环依赖永远不会被破坏,导致你的堆栈溢出。

答案 1 :(得分:1)

这是因为当你构造一个你正在构造B的A时,当调用子类的构造函数时,也会调用超类的构造函数。所以它将进入无限循环。