Tema 6 • Resumen del tema Interfaces

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, static y final.
  • 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
    }
}