Sobes.tech
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