Java: chamada recursiva do construtor e erro de stackoverflow
Ajude a entender por que o código a seguir
public class HeapQn1 {
/**
* @param args
*/
public HeapQn1() {
new HeapQn1();
}
static HeapQn1 n = new HeapQn1();
public static void main(String[] args) {
}
}
resulta em
java.lang.StackOverflowError
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:8)
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:9)
...
De acordo com meu entendimento, a alocação de memória para um objeto acontece na memória heap e eu esperava um OutOfMemoryError, já que em algum momento a memória heap estará cheia devido à criação repetitiva de objetos.
Na pesquisa, deparei-me que um construtor java é considerado um método e que explicava o StackOverflowError, até ler o seguinte thread.
Quando o Construtor é chamado em java?
o que diz
3. The object is fully constructed/created when the constructor returns.
Pelo que pude reunir, o construtor é um método e, como a memória heap é muito maior que a memória da pilha, a chamada recursiva do construtor resultou em StackOverflowError. Isso está correto?
Como nenhum objeto no código de atribuição será completamente criado, a alocação de quadros da pilha para o construtor realmente acontecerá?
--edit-- Para as duplicatas apontadas, eu entendo o que é StackoverflowError. Mencionei na pergunta "Na pesquisa, deparei-me que um construtor java é considerado um método e que explicava o StackOverflowError". Minha pergunta é entender se um construtor obtém um quadro de pilha alocado como outros métodos, pois a criação do objeto não é concluída até o retorno do construtor. Espero que isso esclareça.