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 POO. 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!"Piense en la herencia como una relación "es-un". Un Dog es un Animal, por lo que tiene sentido que Dog extienda a Animal. Esta relación le permite crear clases especializadas que comparten una funcionalidad común mientras agregan sus propios comportamientos únicos.
Desafío
FácilVamos a construir un sistema de vehículos sencillo que demuestre la herencia en acción. Crearás una clase padre que contenga las propiedades comunes de los vehículos y una clase hija que la extienda con un comportamiento especializado.
Organizarás tu código en tres archivos:
Vehicle.java: Crea la clase padre que representa cualquier vehículo. Debe tener:- Un campo privado para la marca del vehículo
brand(String) - Un constructor que acepte el nombre de la marca (el uso de
super()no es necesario aquí ya que Vehicle es el padre) - Un método
getBrand()que devuelva la marca - Un método
start()que imprima:[brand] is starting
- Un campo privado para la marca del vehículo
Motorcycle.java: Crea una subclase que extienda de Vehicle. Una motocicleta es un vehículo, por lo que esta relación "es-un" hace que la herencia sea apropiada. Tu Motorcycle debe:- Usar
extendspara heredar de Vehicle - Tener un constructor que reciba la marca y la pase al padre usando
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 únicos. 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) para tu motocicleta.
Observa cómo tu Motorcycle tiene acceso automáticamente a start() y getBrand() sin tener que volver a escribirlos: ¡ese es el poder de la herencia!
Hoja de referencia
Usa la palabra clave extends para crear una relación de herencia entre clases:
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 del padre
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}La subclase (hija) hereda todos los métodos de la superclase (padre) y puede añadir los suyos propios:
Dog myDog = new Dog("Buddy");
myDog.eat(); // Método heredado
myDog.bark(); // Método propioUsa super() en el constructor de la subclase para llamar al constructor de la clase padre.
La herencia representa una relación "es-un" entre clases.
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 brand
// 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 Iterator