12 Constructores
En Java, un constructor es un bloque de código especial que se ejecuta automáticamente cuando se crea un objeto de una clase. Su propósito principal es inicializar los atributos del objeto. A diferencia de los métodos comunes, el constructor:
Tiene el mismo nombre que la clase. No tiene un tipo de retorno, ni siquiera void.
12.0.1 Definición y Función
El constructor se utiliza para:
Asignar valores iniciales a los atributos de una clase.
Garantizar que un objeto tenga un estado válido desde el momento de su creación.
Ejemplo
public class Persona {
public String nombre;
public int edad;
// Constructor
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
public void mostrarInformacion() {
System.out.println("Nombre: " + nombre + ", Edad: " + edad);
}
}
12.0.2 Tipos de Constructores
12.0.2.1 a. Constructor por Defecto
Un constructor por defecto es un constructor sin parámetros que no se define explícitamente. Si no escribes ningún constructor, el compilador genera uno automáticamente.
12.0.2.2 Ejemplo:
public class Persona {
public String nombre;
public int edad;
// Constructor por defecto generado automáticamente (sin parámetros)
}
public class Main {
public static void main(String[] args) {
= new Persona();
Persona persona .nombre("Luis");
persona.edad(23);
persona}
}
12.0.2.3 b. Constructor Parametrizado
Un constructor parametrizado permite inicializar los atributos del objeto con valores específicos.
12.0.2.4 Ejemplo:
public class Persona {
public String nombre;
public int edad;
// Constructor parametrizado
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
public void mostrarInformacion() {
System.out.println("Nombre: " + nombre + ", Edad: " + edad);
}
}
public class Main {
public static void main(String[] args) {
= new Persona("Juan Pérez", 30);
Persona persona .mostrarInformacion();
persona}
}
12.0.2.5 c. Sobrecarga de Constructores
Java permite definir múltiples constructores en la misma clase, siempre que tengan diferentes listas de parámetros (número o tipo de parámetros). Esto se llama sobrecarga de constructores.
12.0.2.6 Ejemplo:
public class Persona {
public String nombre;
public int edad;
// Constructor vacio
public Persona() {
this.nombre = "Desconocido";
this.edad = 0;
}
// Constructor parametrizado
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
public void mostrarInformacion() {
System.out.println("Nombre: " + nombre + ", Edad: " + edad);
}
}
public class Main {
public static void main(String[] args) {
= new Persona(); // Llama al constructor por defecto
Persona persona1 = new Persona("Ana López", 25); // Llama al constructor parametrizado
Persona persona2
.mostrarInformacion();
persona1.mostrarInformacion();
persona2}
}
12.0.2.7 d. Constructor copia.
Un constructor copia es un tipo especial de constructor que crea un nuevo objeto como una copia exacta de otro objeto existente de la misma clase. Es útil cuando deseas duplicar un objeto sin modificar el original, manteniendo la separación entre las instancias.
El constructor copia toma un objeto de la misma clase como parámetro y copia los valores de sus atributos al nuevo objeto.
12.0.3 Ventajas del Constructor Copia
Facilita la Clonación:
- Permite duplicar objetos sin necesidad de escribir métodos adicionales.
Encapsulamiento:
- Copia los atributos directamente sin exponerlos al exterior.
Separación de Instancias:
- El objeto copiado es independiente del original, incluso si tienen los mismos valores.
Cómo funciona
utiliza la siguiente línea de comando para crear un objeto copia
Persona personaCopia = new Persona(personaOriginal);
Crea un nuevo objeto
personaCopia
Pasa
personaOriginal
como argumento al constructor copia:- El objeto
personaOriginal
se pasa como parámetro al constructor copia, permitiendo que se acceda a sus atributos y se copien en el nuevo objetopersonaCopia
.
- El objeto
Asignación de nombre en el constructor Copia:
- En la línea this.nombre = otraPersona.nombre;
atributonombre
del objeto otraPersona es personaOriginal - Como el atributo
nombre
esprivate
, puedes acceder a él directamente dentro de la misma clase porque las reglas de encapsulamiento lo permiten - Asigna el valor de
otraPersona.nombre
athis.nombre
, copiando el valor del atributo del objeto original al nuevo objeto.
- En la línea this.nombre = otraPersona.nombre;
12.0.3.1 Ejemplo:
public class Persona {
private String nombre; // Nombre de la persona
private int edad; // Edad de la persona
// Constructor parametrizado
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
// Constructor copia
public Persona(Persona otraPersona) {
this.nombre = otraPersona.nombre;
this.edad = otraPersona.edad;
}
// Métodos getter
public String getNombre() {
return nombre;
}
public int getEdad() {
return edad;
}
// Método setter para modificar el nombre
public void setNombre(String nombre) {
this.nombre = nombre;
}
// Método para mostrar información
public void mostrarInformacion() {
System.out.println("Nombre: " + nombre + ", Edad: " + edad);
}
}
public class Main {
public static void main(String[] args) {
// Crear un objeto original
= new Persona("Juan Pérez", 30);
Persona personaOriginal System.out.println("Información de la persona original:");
.mostrarInformacion();
personaOriginal
// Crear una copia del objeto usando el constructor copia
= new Persona(personaOriginal);
Persona personaCopia System.out.println("Información de la persona copia:");
.mostrarInformacion();
personaCopia
// Modificar el nombre de la copia
System.out.println("Modificando el nombre de la copia...");
.setNombre("Ana López");
personaCopia
// Mostrar la información después de la modificación
System.out.println("Información después de la modificación:");
System.out.println("Original:");
.mostrarInformacion(); // Original permanece igual
personaOriginalSystem.out.println("Copia:");
.mostrarInformacion(); // La copia tiene el nuevo nombre
personaCopia}
}