Middle
Quando deve usar uma interface e quando uma classe abstrata?
sobes.tech IA
Resposta da IA
Utilizamos uma classe abstrata para criar funcionalidades básicas e um estado geral que podem ser herdados pelas subclasses. Ela é adequada quando há métodos comuns com implementação e métodos que devem ser sobrescritos. A classe abstrata pode ter campos e construtores.
// Classe abstrata
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void makeSound(); // Método abstrato
void eat() { // Método com implementação
System.out.println(name + " está a comer.");
}
}
Usamos uma interface para definir um contrato que descreve um conjunto de métodos que devem ser implementados pelas classes. Ela é adequada para alcançar comportamentos múltiplos (herança múltipla de funcionalidades). A interface não pode ter estado (campos de instância, exceto constantes) nem construtores (antes do Java 8).
// Interface
interface Flyable {
void fly(); // Método abstrato
}
Tabela comparativa de diferenças:
| Característica | Classe abstrata | Interface |
|---|---|---|
| Tipo de membros | Campos, métodos abstratos e concretos, construtores | Constantes, métodos abstratos (por padrão), métodos estáticos e default (a partir do Java 8) |
| Implementação de métodos | Pode ter métodos com implementação | Apenas métodos abstratos até Java 8, com Java 8 - estáticos e default |
| Estado | Pode ter estado (campos) | Não pode ter estado (campos de instância) |
| Herança | Herança única | Implementação múltipla |
| Uso | "é um" (is-a) - tipo base | "tem uma" (has-a) - contrato de comportamento |