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ácilVamos a construir una jerarquía de transporte que demuestre patrones de herencia simple y multinivel. Crearás una cadena de clases donde cada nivel añade nuevas capacidades, mostrando cómo se heredan los métodos a través de múltiples niveles.
Organizarás tu código en cuatro archivos:
Vehicle.java: Crea la clase base en la parte superior de tu jerarquía. Cada 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 de Vehicle, representando el nivel intermedio de tu cadena multinivel. Los vehículos terrestres añaden un comportamiento específico para el suelo:- Un campo privado para
wheels(int) - Un constructor que tome la marca y las ruedas, usando
super(brand)para la parte del 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 de LandVehicle, completando tu cadena de herencia de tres niveles. Los coches añaden sus propias características especializadas:- Un campo privado para
model(String) - Un constructor que tome la marca, las ruedas y el modelo, 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 los 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 el propio Car
Recibirás tres entradas: el nombre de la marca, el número de ruedas y el nombre del modelo.
Tu salida debería mostrar tres líneas demostrando cómo el objeto Car puede usar métodos de cada nivel de su cadena de herencia - ¡desde el nivel superior Vehicle hasta su propia clase!
Hoja de referencia
Java soporta diferentes estructuras de herencia. Los dos patrones principales son la herencia simple y la herencia multinivel.
La herencia simple ocurre cuando una clase extiende exactamente una clase padre directamente:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }Tanto Dog como Cat heredan de Animal, pero no el uno del otro.
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 la herencia multinivel, una clase hija tiene acceso a todos los métodos de toda la cadena de herencia:
Dog dog = new Dog();
dog.eat(); // De Animal
dog.breathe(); // De Mammal
dog.bark(); // De DogCada jerarquía de clases tiene a Object en la cima. El encadenamiento de constructores fluye a través de todos los niveles al crear un nuevo objeto.
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 Iterator