线A的java.lang.StackOverflowError a = new B()

时间:2014-09-02 17:13:05

标签: java

在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);
}
}

我不知道为什么会收到这个错误

5 个答案:

答案 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.
相关问题