Apuntes Java: Clases – Constructores

Noción de constructor

Cuando se crea un objeto (se instancia una clase) es posible definir un proceso de inicialización que prepare el objeto para ser usado. Esta inicialización se lleva a cabo invocando un método especial denominado constructor. Esta invocación es implícita y se realiza automáticamente cuando se utiliza el operador new. Los constructores tienen algunas características especiales:

  • El nombre del constructor tiene que se igual al de la clase.
  • Puede recibir cualquier número de argumentos de cualquier tipo, como cualquier otro método.
  • No devuelve ningún valor (en su declaración no se declara ni siquiera void).

El constructor no es un miembro más de una clase. Sólo es invocado cuando se crea el objeto (con el operador new). No puede invocarse explícitamente en ningún otro momento.

Continuando con los ejemplos del capítulo anterior se podría escribir un constructor para las clases Punto y Circulo, de la siguiente forma:

class Punto {
    int x , y ;
    Punto ( int a , int b ) {
        x = a ; y = b ;
    }
}

class Circulo {
    Punto centro;
    int radio;
    Circulo (Punto p, int r) {
        centro = p;
        radio = r;
    }
}

Con este constructor se crearía un objeto de la clase Punto o de la clase Circulo de la siguiente forma:

Punto miPunto = new Punto ( 1 , 2 );
Circulo miCirculo = new Circulo( miPunto , 3);
Circulo otroCirculo = new Circulo( new Punto(4,4), 5);

Constructor no-args

Si una clase no declara ningún constructor, Java incorpora un constructor por defecto (denominado constructor no-args) que no recibe ningún argumento y no hace nada.

Si se declara algún constructor, entonces ya no se puede usar el constructor no-args. Es necesario usar el constructor declarado en la clase.

En el ejemplo de la clase punto el constructor no-args sería:

class Punto {
    int x , y ;
    Punto ( ) { }
}

Sobrecarga de constructores

Una clase puede definir varios constructores (un objeto puede inicializarse de varias formas). Para cada instanciación se usa el que coincide en número y tipo de argumentos. Si no hay ninguno coincidente se produce un error en tiempo de compilación.

Por ejemplo:

class Punto {
    int x , y ;
    Punto ( int a , int b ) { // Constructor que recibe dos valores.
        x = a ; y = b ;
    }
    Punto () { // Constructor que reemplaza al constructor no-args por defecto.
        x = 0 ; y = 0;
    }
}

En el ejemplo se definen dos constructores. El citado en el ejemplo anterior y un segundo que no recibe argumentos e inicializa las variables miembro a 0. (Nota: Inicializar valores enteros a 0 es innecesario, porque el sistema ya lo hace. Sin embargo es sintácticamente correcto).

Desde un constructor puede invocarse explícitamente a otro constructor de la misma clase utilizando la palabra reservada this . this es una referencia al propio objeto. Cuando this es seguido por parénteses se entiende que se está invocando al constructor del objeto en cuestión. Puedes ver el uso más habitual de this aquí. El ejemplo anterior puede reescribirse de la siguiente forma:

class Punto {
    int x , y ;
    Punto ( int a , int b ) {
        x = a ; y = b ;
    }
    Punto () {
        this (0,0);
    }
}

Cuando se declaran varios constructores para una misma clase estos deben distinguirse en la lista de argumentos, bien en el número, bien en el tipo.

Esta característica de definir métodos con el  mismo nombre se denomina sobrecarga y es aplicable a cualquier método miembro de una clase como veremos más adelante.

Última actualización: 28/10/2016