它自己的类中的一个对象

时间:2014-08-27 16:18:35

标签: java object

所以让我们说:

public class Sample {  //main() class
    public static void main(String[] args) {
      A a = new A();
    }
}

public class A {
  A aa = new A();
}
  1. 所以...当我运行它时...它给出:java.lang.StackOverflowError。 因此,我的解释是第1行的对象a生成,进一步在第2行创建对象aa生成...然后它进入递归....它继续在对象之后创建对象,直到堆内存已满。

  2. 如果在Heap上创建对象...那为什么说StackOverflowError ??

2 个答案:

答案 0 :(得分:4)

嗯,它同时使用堆堆栈。堆栈空间是因为您以递归方式在A的构造函数中。如果将初始化放在构造函数的主体中,那么看起来会更简单:

public class A {
  A aa;

  public A() {
     aa = new A();
  }
}

因此A构造函数调用自身,然后调用自身,等等。通常堆栈空间比堆栈空间更多,因此为什么你首先耗尽堆栈空间。如果你的类有很多字段,你可能会首先耗尽堆空间 - 虽然通常堆在现代机器中非常庞大。

答案 1 :(得分:0)

堆栈溢出的原因很简单,在(小)As可以填满堆之前,堆栈空间不足。

您已正确识别递归。原来如此!