Saltar a contenido

Los constructores

Un constructor es un método que es llamado automáticamente al crear un objeto de una clase, es decir al usar la instrucción new. Son métodos especiales que sirven para inicializar las instancias de una clase. Su función es inicializar el objeto y sirve para asegurarnos que los objetos siempre contengan valores válidos. Sin embargo, los constructores no tienen un tipo de devolución explicito. Normalmente, se usa un constructor para dar valores iniciales a las variables de instancia definidas por la clase, o para realizar cualquier otro procedimiento de inicio requerido para crear un objeto completamente formado.

Todas las clases tienen constructores, definido explícitamente en el código o no, porque Java proporciona automáticamente un constructor predeterminado o por defecto. En este caso, las variables de miembro no inicializadas tienen sus valores predeterminados, que son cero, null y false, para tipos numéricos, tipos de referencia y booleanos, respectivamente. Una vez que defines tu propio constructor, el constructor predeterminado ya no se usa.

Los constructores también se pueden sobrecargar, como cualquier método, variando la cantidad de parámetros que reciben.

Cuando se crea un objeto de Java se realizan las siguientes operaciones de forma automática:

  1. Se asigna memoria para el objeto.
  2. Se inicializan los atributos de ese objeto con los valores predeterminados por el sistema.
  3. Se llama al constructor de la clase que puede ser uno entre varios.

El constructor de una clase tiene las siguientes características:

  • Tiene el mismo nombre que la clase a la que pertenece.
  • En una clase puede haber varios constructores con el mismo nombre y distinto número de argumentos (se puede sobrecargar).
  • No se hereda.
  • No puede devolver ningún valor (tampoco void).
  • Habitualmente se declara público para que pueda ser invocado incluso desde fuera del paquete donde se desee crear un objeto de esa clase.
public class MiClase {
    private int x;
    public MiClase(){ //constructor
        x = 10; // Inicializo a 10
    }
}
public class App {
    public static void main(String[] args) {
        MiClase obj1 = new MiClase();
        MiClase obj2 = new MiClase();
        System.out.println(obj1.x + ", " + obj2.x); //Da 10, 10
    }
}

Sobrecarga del constructor

En el ejemplo anterior, se utilizó un constructor sin parámetros. Aunque esto está bien para algunas situaciones, la mayoría de las veces necesitará un constructor que acepte uno o más parámetros. Los parámetros se agregan a un constructor de la misma manera que se agregan a un método: simplemente declararlos dentro del paréntesis después del nombre del constructor. Por ejemplo, aquí, MiClase tiene un constructor parametrizado:

public class MiClase {
    private int x;
    public MiClase(int i){ //constructor parametrizado
        x = i;
    }
}
public class App {
    public static void main(String[] args) {
        MiClase obj1 = new MiClase(15);
        MiClase obj2 = new MiClase(28); System.out.println(obj1.x + ", " + obj2.x); //Da 15, 28
    }
}

Hay que tener en cuenta que puede haber más de un constructor para la misma clase. Al igual que ocurría con los métodos, los constructores se pueden sobrecargar. Cuando se sobrecargan los constructores (se utilizan varias posibilidades de constructor), se pueden hacer llamadas a constructores mediante la palabra clave this como veremos más adelante.

Constructor copia

Se puede crear un objeto a partir de otro de su misma clase escribiendo un constructor llamado constructor copia. Este constructor copia los atributos de un objeto existente al objeto que se está creando. Los constructores copia tienen un solo argumento, el cual es una referencia a un objeto de la misma clase que será desde el que queremos copiar. Por ejemplo, para una clase Fecha podemos escribir un constructor copia que permita crear objetos con los valores de otro ya existente:

Fecha fecha = new Fecha(1,1,2011); //se invoca al constructor con parámetros
Fecha fecha1 = new Fecha(fecha); //se invoca al constructor copia

//constructor copia de la clase Fecha
public Fecha(final Fecha f) {
dia = f.dia;
mes = f.mes;
anyo = f.anyo;
}

Actividad

  • AC 610 (RA4/ CE4a CE4b CE4d CE4e CE4f / IC1 / 3p). En una fábrica se requiere de un sistema de clasificación de piezas en función del color. Para ello:

    • Crea una clase llamada Pieza con los siguientes atributos: código de tipo entero y color de tipo char.
    • El programa primero deberá preguntar por el color de 5 piezas (‘v’ verde o ‘a’ azul), contar la cantidad de piezas de cada color y presentar los resultados por pantalla.
    • Posteriormente deberá instanciar una nueva pieza copia de la primera y presentar de nuevo el recuento por pantalla.

    En el main realizar la simulación y comprobación que consideréis.