2014-08-27 59 views
1

所以我们说:一个自己的类内的对象

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. 如果是在堆上创建的对象......那么为什么它说的StackOverflowError?

+0

如果您将堆栈设置得足够大并且堆足够小,那么当您用完堆空间时_will_会生成一个错误。 – DaoWen 2014-08-27 16:25:35

+1

构造函数是一种方法。每个构造函数调用都会占用堆栈空间。 – 2014-08-27 16:25:58

+0

这些对象是在堆上创建的,但是这些对象的引用是在堆栈上创建的。更多的对象=更多的引用=堆栈溢出 – ceptno 2014-08-27 16:30:47

回答

0

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

你已经正确识别递归。所以!

4

那么,它同时使用堆堆栈。堆栈空间是因为你递归地在A的构造函数中。这将是简单的,看看这个,如果你把初始化在构造函数体:

public class A { 
    A aa; 

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

所以A构造函数调用本身,然后调用本身等方面比堆栈空间可用一般,而更多的堆空间,因此,为什么你首先用完堆栈空间。如果你的班级有很多领域,你可能会首先用尽堆空间 - 尽管现代机器通常堆很大。

相关问题