Herencia básica (extends)
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 20 de 87.
La herencia es uno de los pilares fundamentales de la OOP. Permite que una clase adquiera las propiedades y métodos de otra clase, promoviendo la reutilización de código y estableciendo una jerarquía natural entre las clases.
En Java, se crea una relación de herencia utilizando la palabra clave extends. La clase que hereda se llama subclase (o clase hija), y la clase de la que se hereda es la superclase (o clase padre).
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Llama al constructor padre
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}La clase Dog hereda automáticamente el método eat() y el método getName() de Animal. También puede definir sus propios métodos como bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // Heredado: "Buddy is eating"
myDog.bark(); // Método propio: "Buddy says woof!"Piensa en la herencia como una relación «es un». Un Dog es un Animal, por lo que tiene sentido que Dog extienda Animal. Esta relación te permite crear clases especializadas que comparten funcionalidades comunes mientras añaden sus propios comportamientos únicos.
Desafío
FácilConstruyamos un sistema sencillo de vehículos que demuestre la herencia en acción. Crearás una clase principal que contenga las propiedades comunes de los vehículos y una clase secundaria que la amplíe con un comportamiento especializado.
Organizarás tu código en tres archivos:
Vehicle.java: Crea la clase principal que representa cualquier vehículo. Debe tener:- Un campo privado para la
branddel vehículo (String) - Un constructor que acepte el nombre de la marca y lo asigne al campo. (Aquí no se necesita una llamada a
super(), ya que Vehicle está en la parte superior de la jerarquía.) - Un método
getBrand()que devuelva la marca - Un método
start()que imprima:[brand] is starting
- Un campo privado para la
Motorcycle.java: Crea una subclase que amplíe Vehicle. Una motocicleta es un vehículo, por lo que esta relación de «es un» hace que la herencia sea apropiada. Tu Motorcycle debe:- Usar
extendspara heredar de Vehicle - Tener un constructor que reciba la marca y se la pase a la clase principal mediante
super(brand) - Añadir su propio método
wheelie()que imprima:[brand] is doing a wheelie!
- Usar
Main.java: Une todo creando un objeto Motorcycle y demostrando tanto los comportamientos heredados como los propios. Recibirás una entrada: el nombre de la marca. Imprime dos líneas llamando a:- El método heredado
start() - El método propio de Motorcycle,
wheelie()
- El método heredado
Recibirás una entrada: el nombre de la marca (String) de tu motocicleta.
Observa cómo tu Motorcycle tiene acceso automáticamente a start() y getBrand() sin tener que reescribirlos; ¡ese es el poder de la herencia!
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: Crea un objeto Motorcycle con la marca
// TODO: Llama al método start() heredado
// TODO: Llama al método wheelie()
}
}
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