Java: llamada recursiva del constructor y error de stackoverflow
Por favor, ayuda a entender por qué el siguiente código
public class HeapQn1 {
/**
* @param args
*/
public HeapQn1() {
new HeapQn1();
}
static HeapQn1 n = new HeapQn1();
public static void main(String[] args) {
}
}
resultados en
java.lang.StackOverflowError
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:8)
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:9)
...
Según tengo entendido, la asignación de memoria para un objeto ocurre en la memoria de almacenamiento dinámico y esperaba un OutOfMemoryError ya que en algún momento la memoria de almacenamiento dinámico estará llena debido a la creación repetitiva de objetos.
En la investigación, me encontré con que un constructor de Java se considera un método y eso explicaba el StackOverflowError, hasta que leí el siguiente hilo.
¿Cuándo se llama al Constructor en Java?
que dice
3. The object is fully constructed/created when the constructor returns.
Por lo que pude deducir, el constructor es un método y dado que la memoria del montón es mucho más grande que la memoria de la pila, la llamada recursiva del constructor resultó en StackOverflowError. Es esto correcto ?
Dado que ningún objeto en el código de donación se creará por completo, ¿sucederá realmente la asignación de marcos de pila para el constructor?
--editar-- Por los duplicados señalados, entiendo qué es StackoverflowError. He mencionado en la pregunta "En la investigación, me encontré con que un constructor de Java se considera un método y eso explica el StackOverflowError". Mi pregunta es entender si un constructor obtiene un marco de pila asignado al igual que otros métodos, ya que la creación del objeto no se completa hasta que el constructor regrese. Espero que esto aclare.