Herencia simple y multinivel
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 25 de 87.
Hasta ahora, hemos visto clases que extienden directamente a una clase padre. Pero la herencia puede formar diferentes estructuras dependiendo de cómo se relacionen las clases entre sí. Exploremos los dos patrones principales: herencia simple y herencia multinivel.
La herencia simple es lo que hemos estado usando. Una clase extiende exactamente una clase padre directamente:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }Aquí, tanto Dog como Cat heredan de Animal, pero no heredan entre sí. Cada hijo tiene un padre directo.
La herencia multinivel crea una cadena donde una clase extiende a otra clase, la cual a su vez extiende a otra clase:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}En esta cadena, Dog hereda de Mammal, que hereda de Animal. Un objeto Dog tiene acceso a todos los métodos de toda la cadena:
Dog dog = new Dog();
dog.eat(); // De Animal
dog.breathe(); // De Mammal
dog.bark(); // De DogRecuerda que Object se encuentra en la parte superior de cada cadena. Así que nuestro Dog en realidad tiene cuatro niveles: Object -> Animal -> Mammal -> Dog. El encadenamiento de constructores fluye a través de todos estos niveles al crear un nuevo objeto.
Desafío
FácilConstruyamos una jerarquía de transporte que demuestre patrones de herencia tanto simple como multinivel. Crearás una cadena de clases en la que cada nivel añade nuevas capacidades, mostrando cómo se heredan los métodos a través de varios niveles.
Organizarás tu código en cuatro archivos:
Vehicle.java: Crea la clase base en la parte superior de tu jerarquía. Todo vehículo debe tener:- Un campo privado para
brand(String) - Un constructor que acepte la marca
- Un método
getBrand()que devuelva la marca - Un método
move()que imprima:[brand] is moving
- Un campo privado para
LandVehicle.java: Crea una clase que extienda Vehicle, representando el nivel intermedio de tu cadena multinivel. Los vehículos terrestres añaden comportamientos específicos del suelo:- Un campo privado para
wheels(int) - Un constructor que acepte brand y wheels, usando
super(brand)para la parte correspondiente al padre - Un método
getWheels()que devuelva el número de ruedas - Un método
honk()que imprima:[brand] honks!
- Un campo privado para
Car.java: Crea una clase que extienda LandVehicle, completando tu cadena de herencia de tres niveles. Los automóviles añaden sus propias características especializadas:- Un campo privado para
model(String) - Un constructor que acepte brand, wheels y model, usando
super(brand, wheels) - Un método
getModel()que devuelva el modelo - Un método
displayInfo()que imprima:[brand] [model] with [wheels] wheels
- Un campo privado para
Main.java: Demuestra cómo un objeto Car tiene acceso a métodos de los tres niveles de la jerarquía. Recibirás tres entradas: brand (String), wheels (int) y model (String). Crea un Car y llama a estos métodos en orden:move()- heredado de Vehicle (abuelo)honk()- heredado de LandVehicle (padre)displayInfo()- definido en la propia clase Car
Recibirás tres entradas: el nombre de la marca, el número de ruedas y el nombre del modelo.
Tu salida debe mostrar tres líneas que demuestren cómo el objeto Car puede utilizar métodos de cada nivel de su cadena de herencia, desde Vehicle, el nivel superior, hasta su propia clase.
FORMATO DE SALIDA REQUERIDO:Pruébalo tú mismo
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leer entradas
String brand = scanner.nextLine();
int wheels = scanner.nextInt();
scanner.nextLine(); // consumir nueva línea
String model = scanner.nextLine();
// TODO: Crear un objeto Car con los valores de entrada
// TODO: Llamar a move() - heredado de Vehicle (abuelo)
// TODO: Llamar a honk() - heredado de LandVehicle (padre)
// TODO: Llamar a displayInfo() - definido en el propio Car
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón IteratorPractica por tu cuenta: Compilador de Java online