Herencia
martes, 5 de diciembre de 2023
La herencia en Java es uno de los pilares fundamentales de la programación orientada a objetos (POO). Proporciona un mecanismo mediante el cual una clase puede heredar propiedades y comportamientos de otra clase.
Jerarquía de Clases
En la herencia, las clases se organizan en una jerarquía, donde una clase más específica (subclase o clase hija) hereda características de una clase más general (superclase o clase padre).
Por ejemplo si tienes una clase Animal como superclase, podrías tener subclases como Perro y Gato.
La herencia modela la relación es un. Si una clase B hereda de una clase A, se puede decir que B es un tipo de A. Un Perro es un tipo de Animal.
En Java, la herencia se implementa usando la palabra clave extends
. Cuando defines una clase hija, usas extends
para indicar de qué clase está heredando.
public class Animal {
// Superclase
}
public class Perro extends Animal {
// código de la clase hija Perro
}
Métodos y Atributos Heredados
La subclase hereda tanto los métodos como los atributos de la superclase. Esto significa que puede utilizar y modificar el comportamiento definido en la superclase.
Herencia de Atributos
La herencia de atributos permite que la clase hija acceda a los atributos de la clase padre. La visibilidad de estos atributos depende de sus modificadores de acceso (public
, private
, protected
).
public class Animal {
protected String nombre;
public Animal(String nombre) {
this.nombre = nombre;
}
}
public class Perro extends Animal {
// La clase Perro hereda el atributo nombre de la clase Animal
// Puede acceder a él directamente o mediante métodos de la clase padre
}
Herencia de Métodos
Los métodos heredados pueden ser utilizados directamente en la subclase. La visibilidad depende de los modificadores de acceso (public
, private
, protected
).
public class Animal {
public void comer() {
System.out.println("El animal come.");
}
}
public class Perro extends Animal {
// La clase Perro hereda el método comer de la clase Animal
}
public class Perro extends Animal {
public void ladrar() {
System.out.println("¡Guau, guau!");
}
public void realizarActividad() {
comer(); // Acceso al método heredado de la superclase
ladrar(); // Método propio de la subclase
}
}
Override de Métodos
La clase hija puede proporcionar una implementación específica para un método que ya existe en la clase padre. Este proceso se conoce como override o sobrescribir el método de la clase padre.
public class Animal {
public void hacerSonido() {
System.out.println("El animal hace un sonido genérico.");
}
}
public class Perro extends Animal {
@Override
public void hacerSonido() {
System.out.println("El perro ladra.");
}
}
Ejecutar Métodos de la Clase Padre
En casos donde se ha hecho override de un método, la clase hija puede llamar al método de la clase padre utilizando la palabra clave super
.
public class Animal {
public void comer() {
System.out.println("El animal come.");
}
}
public class Perro extends Animal {
@Override
public void comer() {
super.comer(); // Llamada al método de la clase padre
System.out.println("El perro mastica sus alimentos.");
}
}
Acceso a Atributos de la Clase Padre
Los atributos heredados pueden ser utilizados directamente en la clase hija o mediante métodos proporcionados por la clase padre (si el atributo es privado).
public class Animal {
private int edad;
public Animal(int edad) {
this.edad = edad;
}
public int obtenerEdad() {
return this.edad;
}
}
public class Perro extends Animal {
// La clase Perro hereda el atributo edad de la clase Animal
// Puede acceder a él a través del método obtenerEdad
}
Constructores en Herencia
Cuando creas una instancia de una clase hija, el constructor de la clase padre se llama implícitamente antes de que se ejecute el cuerpo del constructor de la clase hija.
Puedes usar la palabra clave super
para hacer una llamada explícita al constructor de la clase padre desde el constructor de la clase hija. Esto es útil cuando la clase padre tiene un constructor que acepta parámetros. Por ejemplo:
public class Animal {
public Animal(String nombre) {
System.out.println("Constructor de Animal con nombre: " + nombre);
}
}
public class Perro extends Animal {
public Perro(String nombre) {
super(nombre); // Llamada explícita al constructor de la clase Animal
System.out.println("Constructor de Perro con nombre: " + nombre);
}
}
Constructores Sobrecargados
Puedes tener constructores sobrecargados en las clases padre e hijas. Cada constructor puede inicializar diferentes conjuntos de propiedades.
public class Animal {
public Animal() {
System.out.println("Constructor sin parámetros de Animal");
}
public Animal(String nombre) {
System.out.println("Constructor de Animal con nombre: " + nombre);
}
}
public class Perro extends Animal {
public Perro() {
System.out.println("Constructor sin parámetros de Perro");
}
public Perro(String nombre) {
super(nombre);
System.out.println("Constructor de Perro con nombre: " + nombre);
}
}
Orden Ejecución de Constructores
En una jerarquía de clases, los constructores se ejecutan en orden desde la clase superior hasta la clase más específica.
public class Animal {
public Animal() {
System.out.println("Constructor de Animal");
}
}
public class Mamifero extends Animal {
public Mamifero() {
System.out.println("Constructor de Mamifero");
}
}
public class Perro extends Mamifero {
public Perro() {
System.out.println("Constructor de Perro");
}
}
Si creas una instancia de Perro
, se ejecutarán los constructores en el orden: Animal
-> Mamifero
-> Perro
.
Compártelo
Compártelo en tus redes sociales y desafía a tus amigos a resolver problemas de programación. Juntos, podemos aprender y crecer.
Copiado
El codigo se ha copiado correctamente en el portapapeles.