Lecciones del módulo (1/2)
Herencia
La herencia es un mecanismo fundamental de la OOP que permite a una clase (llamada clase hija o subclase) heredar campos y métodos de otra clase (llamada clase padre o superclase).
Esto promueve la reutilización de código y evita duplicaciones innecesarias.
Extender una Clase con extends
En Java, usamos la palabra clave extends para indicar que una clase hereda de otra:
class Vehicle {
protected int speed; // 'protected' rende il campo visibile alle sottoclassi
public void honk() {
System.out.println("Beep beep!");
}
}
class Car extends Vehicle {
// Car eredita automaticamente il campo speed e il metodo honk()
}
El Constructor y la Palabra Clave super()
Si la superclase tiene un constructor que acepta parámetros, la subclase debe llamarlo explícitamente en su constructor usando super(...) como la primerísima instrucción:
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
int studentId;
public Student(String name, int studentId) {
super(name); // Richiama il costruttore di Person
this.studentId = studentId;
}
}
Sobrescritura de Métodos (@Override)
Una subclase puede proporcionar su propia implementación específica para un método heredado de la superclase. Esta operación se llama sobrescritura (method overriding) y se indica con la anotación @Override.
class Animal {
public void makeSound() {
System.out.println("Rumore generico");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Miao!");
}
}
El Modificador protected
El modificador de acceso protected juega un papel clave en la herencia. A diferencia de private, que hace que los miembros sean visibles solo dentro de la misma clase, protected permite el acceso a los campos y métodos tanto dentro del mismo paquete (package) como por parte de todas las subclases, incluso si se encuentran en paquetes diferentes.
Acceder a los Miembros del Padre con super
Además de invocar al constructor de la superclase, la palabra clave super se puede usar dentro de los métodos de la subclase para hacer referencia a métodos o variables de la clase padre. Esto es particularmente útil cuando se sobrescribe un método, pero aún se desea invocar el comportamiento original del padre:
class Animal {
public void sleep() {
System.out.println("Zzz");
}
}
class Cat extends Animal {
@Override
public void sleep() {
super.sleep(); // Esegue il comportamento di Animal
System.out.println("Il gatto fa le fusa mentre dorme.");
}
}
Herencia Simple en Java
En Java, una clase puede extender una sola clase (herencia simple). No está permitido heredar directamente de múltiples clases (herencia múltiple), por ejemplo class Cat extends Animal, Mammal generará un error. Esta decisión de diseño evita ambigüedades conocidas como el "problema del diamante" (cuando dos superclases definen el mismo método con implementaciones diferentes). Para superar este límite, Java introduce el concepto de Interfaces, que veremos en el próximo módulo.
Pruébalo tú
Completa la subclase Dog extendiendo Animal. Declara el constructor de Dog que acepta un nombre (String) y usa super(name) para pasarlo al constructor de Animal.
Mostrar pista
Escribe `public Dog(String name) { super(name); }` dentro de la clase Dog.
Solución disponible después de 3 intentos
Extiende Dog de Animal y sobrescribe el método makeSound() de modo que devuelva la cadena Woof en lugar de Generic Sound. Usa la anotación @Override.
Mostrar pista
Escribe `@Override` sobre la declaración `public String makeSound() { return 'Woof'; }` dentro de Dog.
Solución disponible después de 3 intentos
Declara una clase Cat que extienda Animal y sobrescriba el método makeSound() de modo que devuelva la cadena Meow. La clase Animal ya tiene un constructor que acepta un nombre; asegúrate de que el constructor de Cat acepte también un nombre y lo pase correctamente al constructor de la superclase.
Mostrar pista
Crea la clase `Cat` extendiendo `Animal`. Declara el constructor `public Cat(String name) { super(name); }` y sobrescribe el método `makeSound()` usando `@Override` para devolver `'Meow'`.
Solución disponible después de 3 intentos