在A行a =新B()我收到错误
abstract class A{
}
class B extends A{
A a=new B();
}
public class Test {
public static void main(String[] args) {
B ab=new B();
System.out.println(ab.a);
}
}
我不知道为什么会收到这个错误
答案 0 :(得分:6)
您以递归方式创建B的实例。
class B extends A{
A a=new B(); // will get called infinitely. So, you get StackOverFlowError
}
答案 1 :(得分:3)
StackOverflowError意味着您有太多的函数调用来使其数据适合堆栈。通常,它表示您正在进行无限递归,就像在这种情况下一样。
当你在Test类中创建对象B时,B类一遍又一遍地创建另一个对象B.
class B extends A{
A a=new B(); // problem here
}
答案 2 :(得分:2)
在B
声明中调用B
的构造函数的事实是无限递归的情况。没有办法让它发挥作用。
您必须根据请求延迟加载实例:
class B extends A {
private A a;
public A getA() {
if(a == null) {
a = new B();
}
return a;
}
}
显然这段代码不是线程安全的,但它至少可以让你开始。
答案 3 :(得分:2)
class B extends A{
A a=new B();
}
在第A a=new B();
行,再次调用类B
的默认构造函数。这种情况不断发生,由于B
的构造函数调用帧,堆栈变满了。
答案 4 :(得分:2)
代码
class B extends A{
A a=new B();
}
您决定B
的每个实例都需要拥有自己的字段,该字段将保存B
的其他实例。
因此,每次调用new B()
时,都需要创建另一个B
实例,但另一个实例也需要拥有自己的另一个B
实例,依此类推。
您可以通过这种方式将其可视化
new B()
|(requires)
+-- A a = new B();
|(requires)
+-- A a = new B();
|(requires)
+-- A a = new B();
|(requires)
+-- ... and so on until stack will overflow.