Sobes.tech
Middle

¿Cuándo se debe usar una interfaz y cuándo una clase abstracta?

sobes.tech AI

Respuesta de la IA

Utilizamos una clase abstracta para crear funcionalidades básicas y un estado general que pueden heredar las subclases. Es adecuada cuando hay métodos comunes con implementación y métodos que deben ser sobrescritos. La clase abstracta puede tener campos y constructores.

// Clase abstracta
abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void makeSound(); // Método abstracto

    void eat() { // Método con implementación
        System.out.println(name + " está comiendo.");
    }
}

Usamos una interfaz para definir un contrato que describe un conjunto de métodos que deben ser implementados por las clases. Es adecuada para lograr comportamientos múltiples (herencia múltiple de funcionalidad). La interfaz no puede tener estado (campos de instancia, excepto constantes) ni constructores (antes de Java 8).

// Interfaz
interface Flyable {
    void fly(); // Método abstracto
}

Tabla comparativa de diferencias:

Característica Clase abstracta Interfaz
Tipo de miembros Campos, métodos abstractos y concretos, constructores Constantes, métodos abstractos (por defecto), métodos estáticos y default (desde Java 8)
Implementación de métodos Puede tener métodos con implementación Solo métodos abstractos hasta Java 8, con Java 8 - estáticos y default
Estado Puede tener estado (campos) No puede tener estado (campos de instancia)
Herencia Herencia simple Implementación múltiple
Uso "es un" (is-a) - tipo base "tiene" (has-a) - contrato de comportamiento