Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
Dominando la herencia en Java
Explora la herencia en Java en profundidad: comprende sus principios, ejemplos del mundo real y cómo aplicarla para código más limpio y reutilizable.
La herencia es una piedra angular de la programación orientada a objetos que te permite crear una nueva clase basada en una existente.
La clase derivada se llama subclase (hija o derivada), mientras que la clase que extiende es la superclase (padre o base). La palabra clave extends establece esta relación.
class Animal { // métodos y campos } class Perro extends Animal { // Perro hereda campos y métodos de Animal }
Aquí, Perro hereda todos los miembros de Animal —la subclase gana la funcionalidad del padre.
Ejemplo 1: Herencia básica
class Animal { String nombre; public void comer() { System.out.println("Puedo comer"); } } class Perro extends Animal { public void mostrar() { System.out.println("Mi nombre es " + nombre); } } class Main { public static void main(String[] args) { Perro labrador = new Perro(); labrador.nombre = "Rohu"; labrador.mostrar(); labrador.comer(); } }
Salida
Mi nombre es Rohu Puedo comer
En este ejemplo, Perro hereda nombre y comer() de Animal, por lo que un objeto Perro puede acceder a ellos directamente.

La relación es-un
La herencia en Java representa una relación es-un: una subclase es una forma especializada de su superclase.
- Coche es un Vehículo
- Naranja es una Fruta
- Cirujano es un Doctor
- Perro es un Animal
Estas jerarquías naturales justifican el uso de la herencia.
Sobrescritura de métodos
Cuando una subclase define un método con la misma firma que su superclase, el método de la subclase sobrescribe la versión de la superclase. Esto permite polimorfismo en tiempo de ejecución.
Ejemplo 2: Sobrescribiendo comer()
class Animal { public void comer() { System.out.println("Puedo comer"); } } class Perro extends Animal { @Override public void comer() { System.out.println("Como comida de perro"); } public void ladrar() { System.out.println("Puedo ladrar"); } } class Main { public static void main(String[] args) { Perro labrador = new Perro(); labrador.comer(); labrador.ladrar(); } }
Salida
Como comida de perro Puedo ladrar
La llamada a comer() en labrador resuelve al método sobrescrito en Perro.
@Override es opcional pero altamente recomendada —asegura que el compilador verifique que efectivamente estás sobrescribiendo un método.Usando super para acceder a la superclase
Al sobrescribir, la palabra clave super te permite invocar la implementación del padre.
Ejemplo 3: super en comer()
class Animal { public void comer() { System.out.println("Puedo comer"); } } class Perro extends Animal { @Override public void comer() { super.comer(); System.out.println("Como comida de perro"); } public void ladrar() { System.out.println("Puedo ladrar"); } } class Main { public static void main(String[] args) { Perro labrador = new Perro(); labrador.comer(); labrador.ladrar(); } }
Salida
Puedo comer Como comida de perro Puedo ladrar
Aquí, super.comer() llama al método definido en Animal antes de ejecutar la lógica de la subclase.
De forma similar, super puede invocar constructores de la superclase.
Miembros protected en herencia
Los campos o métodos marcados protected son accesibles para subclases independientemente del paquete.
Ejemplo 4: Accediendo a miembros protected
class Animal { protected String nombre; protected void mostrar() { System.out.println("Soy un animal."); } } class Perro extends Animal { public void obtenerInfo() { System.out.println("Mi nombre es " + nombre); } } class Main { public static void main(String[] args) { Perro labrador = new Perro(); labrador.nombre = "Rocky"; labrador.mostrar(); labrador.obtenerInfo(); } }
Salida
Soy un animal. Mi nombre es Rocky
La subclase puede leer y modificar libremente el campo protected nombre y llamar a mostrar().
¿Por qué usar herencia?
- Reutilización de código: Una clase hija hereda automáticamente todos los miembros públicos y protegidos de su padre.
- Polimorfismo: La sobrescritura permite despacho dinámico de métodos, una característica clave del polimorfismo en tiempo de ejecución.
Tipos de herencia
Java soporta cinco modelos conceptuales de herencia —cada uno útil en diferentes escenarios.
1. Herencia simple
Una clase extiende solo una superclase.

2. Herencia multinivel
Una subclase se convierte en la superclase de otra clase, creando una cadena.

3. Herencia jerárquica
Múltiples subclases heredan de una sola superclase.

4. Herencia múltiple
Java no permite que una clase extienda más de una clase, pero las interfaces proporcionan una forma de lograr este patrón.

5. Herencia híbrida
Una mezcla de dos o más tipos de herencia —por ejemplo, combinando herencia jerárquica y múltiple.

Java
- Dominando la herencia en C#: Conceptos, tipos y código práctico
- Herencia en C#: Construyendo código reutilizable y mantenible
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación