我第一次遇到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;关系,就像这里的情况一样。我将使用组合而不是继承来解决我的问题,但我的问题是
我不明白为什么会出现这个问题。由于(我假设)某种无限循环,它耗尽了内存,但我不知道为什么。 在这种情况下,我如何正确使用继承?
非常感谢任何帮助。
答案 0 :(得分:1)
由于B扩展了A,每次调用B的构造函数时,你也会调用A。但是,在A的构造函数的实现中,实例化一个B,在它的构造上,它调用A的构造函数。这种循环依赖永远不会被破坏,导致你的堆栈溢出。
答案 1 :(得分:1)
这是因为当你构造一个你正在构造B的A时,当调用子类的构造函数时,也会调用超类的构造函数。所以它将进入无限循环。