Resumen del Tema 6: Interfaces en Java
En este tema abordamos las Interfaces, un mecanismo fundamental en Java para definir contratos, favorecer el polimorfismo y mejorar el diseño modular de nuestras aplicaciones.
1. ¿Qué es una Interfaz?
Una interfaz es una plantilla que define un conjunto de métodos abstractos y constantes. Representa otra forma de lograr la abstracción en la Programación Orientada a Objetos. Sus características principales son:
- Métodos abstractos: Se declaran sin cuerpo y deben ser implementados obligatoriamente por las clases. (No es necesario poner la palabra
abstract). - Constantes: Son implícitamente
public,staticyfinal. - Instanciación: Una interfaz no puede ser instanciada directamente.
- Herencia múltiple: A diferencia de las clases, una clase puede implementar varias interfaces a la vez.
- Novedades (Desde Java 8): Las interfaces pueden tener métodos por defecto (
default) y métodos estáticos con implementación.
2. Interfaces vs Clases Abstractas
Aunque ambas logran abstracción, tienen diferencias clave en su propósito y reglas de uso:
| Característica | Interfaz | Clase Abstracta |
|---|---|---|
| Métodos | Solo abstractos (hasta Java 7). Desde Java 8, también default y static. |
Abstractos y concretos. |
| Herencia | Herencia múltiple (una clase implementa varias interfaces). | Herencia simple (una clase solo extiende de otra). |
| Modificadores | public o default (package). |
Puede tener cualquier modificador. |
| Usos | Clases no muy relacionadas a las que queremos añadir funcionalidades comunes. | Clases muy relacionadas entre sí. |
3. Sintaxis y Ejemplo Completo
Para definir una interfaz utilizamos la palabra reservada interface. Veamos un ejemplo con la interfaz Vehiculo y su implementación en la clase Coche.
La Interfaz
public interface Vehiculo {
// Atributo (constante)
int VELOCIDAD_MAXIMA = 120;
// Métodos abstractos
void acelerar(int cantidad);
void frenar(int cantidad);
// Método default (Java 8+)
default void mostrarVelocidadMaxima() {
System.out.println("Velocidad máxima: " + VELOCIDAD_MAXIMA);
}
// Método estático
static void informacionGeneral() {
System.out.println("Los vehículos permiten desplazarse.");
}
}
La Implementación
Usamos la palabra clave implements y sobrescribimos (@Override) los métodos abstractos.
public class Coche implements Vehiculo {
private int velocidadActual;
@Override
public void acelerar(int cantidad) {
velocidadActual += cantidad;
if (velocidadActual > VELOCIDAD_MAXIMA) {
velocidadActual = VELOCIDAD_MAXIMA;
}
}
@Override
public void frenar(int cantidad) {
velocidadActual -= cantidad;
if (velocidadActual < 0) {
velocidadActual = 0;
}
}
public void mostrarEstado() {
System.out.println("Velocidad actual: " + velocidadActual);
}
}
4. Herencia e Interfaces Juntas
En Java, una clase puede heredar de una superclase (usando extends) y al mismo tiempo implementar una o varias interfaces (usando implements). El orden es estricto: primero se extiende y luego se implementa.
class Perro extends Animal implements Corredor, Nadador {
// Implementación de métodos abstractos de Animal
// Implementación de métodos abstractos de Corredor y Nadador
}
5. Buenas Prácticas y Polimorfismo
Una regla de oro en el diseño orientado a objetos es: Se declara con Interfaces y se instancia con Clases. Esto favorece un código mucho más flexible.
Animal mascota = new Perro();
Así se favorece un código más flexible gracias al polimorfismo.
public class Main {
public static void main(String[] args) {
Animal a;
a = new Perro();
a.hacerSonido(); // Imprime: Guau
a = new Gato();
a.hacerSonido(); // Imprime: Miau
}
}