2014-08-27 63 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構造函數調用本身,然後調用本身等方面比堆棧空間可用一般,而更多的堆空間,因此,爲什麼你首先用完堆棧空間。如果你的班級有很多領域,你可能會首先用盡堆空間 - 儘管現代機器通常堆很大。

相關問題