Lecciones del módulo (1/2)
Interfaces
Mientras que las clases abstractas pueden contener tanto código parcialmente implementado como campos de instancia, las interfaces en Java son contratos de puro comportamiento. Una interfaz define qué debe saber hacer una clase, pero no cómo lo hace.
Esto permite un desacoplamiento total entre la definición de las operaciones y su implementación real.
Definir una Interfaz (interface)
Se utiliza la palabra clave interface. Todos los métodos declarados en una interfaz son implícitamente public y abstract (no es necesario especificarlo):
interface Drivable {
void startEngine();
void stopEngine();
}
Implementar una Interfaz (implements)
Una clase implementa una interfaz usando la palabra clave implements y está obligada a proporcionar la implementación (con el cuerpo) para todos los métodos definidos:
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}
Ventajas de las Interfaces
- Herencia Múltiple: En Java, una clase puede extender solo una clase padre (herencia simple), pero puede implementar múltiples interfaces al mismo tiempo.
Code
class HybridCar implements Drivable, Chargeable { ... } - Desacoplamiento: Puedes definir variables usando el tipo de la interfaz. Cualquier objeto que implemente esa interfaz puede asignarse a dicha variable.
Code
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
Constantes en las Interfaces
En las interfaces es posible declarar campos. Estos campos son implícitamente public static final (es decir, constantes de clase), incluso si no se especifican estos modificadores. Por lo tanto, deben inicializarse inmediatamente en el momento de la declaración:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitamente public static final
}
Métodos por Defecto (default)
A partir de Java 8, es posible definir métodos con una implementación por defecto dentro de una interfaz utilizando la palabra clave default. Estos métodos no obligan a las clases que implementan la interfaz a sobrescribirlos, proporcionando un comportamiento de respaldo:
interface Logger {
void log(String message);
// Metodo di default con corpo
default void logError(String message) {
log("ERRORE: " + message);
}
}
Pruébalo tú
Crea la interfaz Flyable con el método void fly(). Luego implementa la clase Bird para que implemente Flyable y muestre Flying en pantalla.
Mostrar pista
En Flyable escribe `void fly();`. En la clase Bird implementa el método marcándolo con `@Override public void fly() { System.out.println('Flying'); }`.
Solución disponible después de 3 intentos
Define la interfaz Drawable con el método void draw(). Luego implementa la clase Rectangle para que implemente Drawable y muestre Drawing Rectangle.
Mostrar pista
Define `void draw();` en la interfaz. En Rectangle usa `@Override public void draw() { System.out.println('Drawing Rectangle'); }`.
Solución disponible después de 3 intentos
Completa la interfaz Swimmable definiendo el método void swim(). Luego completa la clase Duck para que implemente tanto Flyable como Swimmable, mostrando Flying en el método fly() y Swimming en el método swim().
Mostrar pista
Declara `void swim();` en Swimmable. Declara `class Duck implements Flyable, Swimmable` e implementa ambos métodos imprimiendo las cadenas requeridas.
Solución disponible después de 3 intentos