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.

questionAnswers(5)

yourAnswerToTheQuestion