Menu

Constructores en Java: inicializar objetos con new

Cómo funcionan los constructores en Java: el constructor por defecto, los constructores parametrizados, this, la sobrecarga de constructores y el encadenamiento con this() y super().

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Por qué existen los constructores

En la página anterior creaste clases y objetos con new. Un constructor es el código que realmente se ejecuta durante esa llamada a new. Su único propósito es devolverte un objeto listo para usar: con todos sus campos obligatorios establecidos y sin estados a medio inicializar.

Un constructor se parece a un método, pero con dos diferencias: tiene el mismo nombre que la clase y no tiene tipo de retorno, ni siquiera void.

new Point(3, 4) reserva el objeto y luego ejecuta el cuerpo del constructor con x = 3 e y = 4. Para cuando new retorna, p está completamente inicializado.

La palabra clave this

Dentro del constructor de arriba, los parámetros se llaman x e y, igual que los campos. this.x significa "el campo x que pertenece a este objeto", mientras que x a secas se refiere al parámetro. Sin this, x = x se asignaría el parámetro a sí mismo y dejaría el campo intacto.

Solo necesitas this cuando un parámetro oculta un campo, pero mucha gente lo usa en todas partes por claridad. El error habitual es olvidarlo cuando los nombres coinciden: el código compila, se ejecuta y deja silenciosamente tus campos en sus valores por defecto (null, 0, false).

El constructor por defecto

Si nunca escribes un constructor, Java proporciona discretamente un constructor por defecto: un constructor público, sin argumentos, que no hace nada adicional. Por eso new funcionaba en clases que no tenían ningún constructor.

La trampa: en cuanto escribes cualquier constructor, el gratuito desaparece.

class Box {
    int size;

    Box(int size) {       // ahora NO hay constructor sin argumentos
        this.size = size;
    }
}

new Box();   // error de compilación: no existe el constructor Box()

Si aún quieres que new Box() funcione, declara tú mismo el constructor sin argumentos:

Sobrecarga de constructores

Una clase puede tener varios constructores siempre que sus listas de parámetros difieran: esto no es más que la sobrecarga de métodos aplicada a los constructores. Cada uno ofrece una forma distinta de construir el objeto.

Java elige el constructor que coincide según el número y los tipos de argumentos que le pasas a new.

Encadenamiento con this()

Fíjate en la duplicación de arriba: cada constructor asigna los campos por sí mismo. Puedes evitarlo haciendo que un constructor llame a otro con this(...). La llamada debe ser la primera instrucción del constructor.

Ahora la inicialización real vive en un solo sitio. Los constructores más pequeños solo rellenan los valores por defecto y delegan el trabajo. Si alguna vez intentas poner una instrucción antes de this(...), el compilador la rechaza.

Los constructores y super()

Cada constructor llama implícitamente primero al constructor de su superclase. Si no escribes nada, Java inserta un super() oculto (el constructor sin argumentos de la superclase) al principio del cuerpo. Trabajarás con esto directamente en cuanto empieces a crear subclases, que es el próximo tema.

class Animal {
    String name;
    Animal(String name) { this.name = name; }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);   // aquí hay que llamar al constructor del padre explícitamente
    }
}

Como Animal no tiene constructor sin argumentos, Dog debe llamar a super(name) explícitamente: no hay un super() gratuito al que recurrir. Igual que this(), una llamada a super(...) tiene que ser la primera instrucción del constructor.

Próximo: Herencia

Los constructores inicializan un único objeto, pero super() ya insinuó algo más grande: las clases pueden construirse sobre otras clases, reutilizando sus campos, métodos y constructores. Esa relación, una clase que extiende a otra, es la herencia, y es la próxima página.

Preguntas frecuentes

¿Qué es un constructor en Java?

Un constructor es un método especial que se ejecuta cuando creas un objeto con new. Tiene el mismo nombre que la clase y no tiene tipo de retorno (ni siquiera void). Su tarea es dejar el nuevo objeto en un estado inicial válido, normalmente asignando los argumentos del constructor a los campos del objeto.

¿Cuál es la diferencia entre un constructor y un método en Java?

Un constructor tiene exactamente el mismo nombre que la clase y no declara ningún tipo de retorno, y solo puede invocarse con new al crear un objeto. Un método normal tiene su propio nombre, declara un tipo de retorno (o void) y se llama sobre un objeto ya existente. Los constructores inicializan; los métodos hacen el trabajo después.

¿Qué ocurre si no escribo ningún constructor en Java?

El compilador te da gratis un constructor por defecto sin argumentos que no recibe parámetros y no hace nada más allá de la llamada implícita a super(). Pero en cuanto escribes cualquier constructor tú mismo, ese gratuito desaparece, así que si añades un constructor parametrizado y aún quieres que new Thing() funcione, debes declarar explícitamente el constructor sin argumentos.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR