Java: рекурсивный вызов конструктора и ошибка stackoverflow
Пожалуйста, помогите понять, почему следующий код
public class HeapQn1 {
/**
* @param args
*/
public HeapQn1() {
new HeapQn1();
}
static HeapQn1 n = new HeapQn1();
public static void main(String[] args) {
}
}
результаты в
java.lang.StackOverflowError
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:8)
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:9)
...
Согласно моему пониманию, выделение памяти для объекта происходит в динамической памяти, и я ожидал OutOfMemoryError, так как в какой-то момент динамическая память будет заполнена из-за повторяющегося создания объекта.
В ходе исследования я обнаружил, что Java-конструктор считается методом, и это объясняет StackOverflowError, пока я не прочитал следующую ветку.
Когда конструктор вызывается в Java?
который говорит
3. The object is fully constructed/created when the constructor returns.
Из того, что я мог бы узнать, конструктор является методом, и, поскольку кучная память намного больше, чем стековая память, рекурсивный вызов конструктора привел к StackOverflowError. Это правильно ?
Поскольку ни один объект в данном коде не будет полностью создан, произойдет ли выделение стека для конструктора?
--edit-- Для указанных дубликатов я понимаю, что такое StackoverflowError. Я упомянул в вопросе «Об исследованиях, я обнаружил, что Java-конструктор считается методом, и это объясняет StackOverflowError». Мой вопрос заключается в том, чтобы понять, получает ли конструктор стековый фрейм, выделенный точно так же, как другие методы, поскольку создание объекта не завершено, пока конструктор не вернется. Надеюсь, это проясняет.