Constructores
Cuando se crea un objeto, los atributos se inicializan por defecto de la siguiente manera:
- Tipos de datos numéricos:
0 - Referencias a objetos:
null - Booleanos:
false
En el momento de crear un objeto, deberíamos asignar valores a los atributos para no utilizar los valores por defecto. El operador new facilita esta tarea mediante los constructores. Estos son métodos especiales que deben tener el mismo nombre que la clase, se definen sin tipo de retorno y se ejecutan inmediatamente después de crear el objeto.
El principal cometido de un constructor es asignar valores a los atributos, pero también se puede utilizar para ejecutar cualquier código necesario.
Al constructor se le pueden pasar parámetros como a cualquier otro método. Vamos a crear un constructor para la clase Persona:
Persona(String nombre, int edad, double estatura) {
this.nombre = nombre;
this.edad = edad;
this.estatura = estatura;
}
Inicialización de atributos en su definición
Los atributos también se pueden inicializar directamente en su declaración dentro de la clase. Esta es una forma sencilla y directa de dar un valor por defecto a los atributos.
class Persona {
String nombre = "Desconocido"; // Inicialización en la declaración
int edad = 0; // Inicialización en la declaración
}
Si se inicializa un atributo en la declaración, el valor por defecto estará disponible para cualquier método que acceda a ese atributo. Es útil especialmente para valores que no cambian y que tienen sentido como valores por defecto. Los atributos se inicializan antes de que se llame a cualquier constructor, lo que significa que se podrán utilizar inmediatamente en métodos que no requieran argumentos.
Es posible combinar ambos métodos, inicializando atributos en la declaración y en el constructor.
class Persona {
String nombre = "Desconocido"; // Inicialización por defecto
int edad; // Inicialización en la declaración
// Constructor
Persona(int edad) {
this.edad = edad; // Inicialización en el constructor
}
}
Especificación de los valores de los parámetros
Los valores de los parámetros de entrada se especifican al crear el objeto con new:
Persona manu = new Persona("Manuel", 32, 1.70);
En los constructores también existe la sobrecarga y es bastante útil. A la hora de sobrecargar un método debemos asegurarnos de que se pueden distinguir mediante número y/o tipo de parámetros de entrada.
Podría darse el caso de que solo conociéramos el nombre de la persona, fijando valores arbitrarios para el resto de atributos. Por lo tanto podríamos hacer dos constructores sobrecargados:
// Constructor 1
Persona(String nombre, int edad, double estatura){
this.nombre = nombre;
this.edad = edad;
this.estatura = estatura;
}
// Constructor 2
Persona(String nombre){
this.nombre = nombre;
estatura = 1.75; // valor de la media de estatura
// edad ya se inicializa a cero
}
Podríamos crear, por lo tanto, objetos de la clase Persona utilizando dos constructores diferentes:
Persona a = new Persona("Manuel",32,1.70); // Llamada al constructor 1
Persona b = new Persona("Ramón"); // Llamada al constructor 2
Método this()
Cuando una clase dispone de un conjunto de constructores sobrecargados, es posible que un constructor invoque a otro. Lo que no se puede es invocar por su nombre directamente, sino mediante el constructor genérico this().
Vamos a reescribir los constructores de la clase Persona utilizando this():
Persona(String nombre, int edad, double estatura){
this.nombre = nombre;
this.edad = edad;
this.estatura = estatura;
}
Persona(String nombre){
this(nombre, 0, 1.75); // Llamamos al constructor anterior
}
Siempre que utilicemos this en un constructor, esta instrucción debe ser la primera instrucción del cuerpo del constructor.
Documentación
Se aplica el mismo procedimiento que en el caso de los métodos.