Please help to understand why does the following code
public class HeapQn1 {
/**
* @param args
*/
public HeapQn1() {
new HeapQn1();
}
static HeapQn1 n = new HeapQn1();
public static void main(String[] args) {
}
}
results in
java.lang.StackOverflowError
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:8)
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:9)
...
As per my understanding the memory allocation for an object happens in the heap memory and I was expecting an OutOfMemoryError as at some point the heap memory will be full because of repetitive object creation.
On research , I came across that a java constructor is considered a method and that explained the StackOverflowError , until I read the following thread.
When does the Constructor gets called in java?
which says
3. The object is fully constructed/created when the constructor returns.
From what I could gather , the constructor is a method and since the heap memory is much larger than stack memory , the recursive constructor call resulted in StackOverflowError . Is this correct ?
Since no object in the give code will get completely created , will stack frame allocation for constructor actually happen ?
--edit--
For the duplicates pointed out , I do understand what StackoverflowError is . I have mentioned in the question "On research , I came across that a java constructor is considered a method and that explained the StackOverflowError". My question is to understand if a constructor gets a stack frame allocated just like other methods as the object creation is not complete until the constructor returns. Hope this clarifies.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…