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 |