Interface e Polimorfismo
implements, métodos default e polimorfismo
Uma interface define um contrato: uma lista de métodos que qualquer classe que a implement precisa fornecer. Diferente de classes abstratas, uma classe pode implementar múltiplas interfaces, resolvendo o problema da herança múltipla.
Polimorfismo significa "muitas formas" — um mesmo tipo de referência (interface ou superclasse) pode apontar para objetos de subtipos diferentes, e o método correto é chamado em tempo de execução. Isso permite escrever código genérico que funciona com qualquer implementação.
Desde o Java 8, interfaces podem ter métodos default (implementação padrão que as classes herdam) e métodos static. Isso permite evoluir uma interface sem quebrar as implementações existentes.
// ── Interface: contrato ───────────────────────────
public interface Animal {
String fazerSom(); // abstrato: toda classe deve implementar
// Método default: implementação padrão (Java 8+)
default void apresentar() {
System.out.println("Sou " + getClass().getSimpleName()
+ " e faço: " + fazerSom());
}
}
public interface Treinavel {
void executarComando(String comando);
}
// ── Implementação múltipla ────────────────────────
class Cachorro implements Animal, Treinavel {
@Override public String fazerSom() { return "Au!"; }
@Override
public void executarComando(String cmd) {
System.out.println("Cachorro executa: " + cmd);
}
}
class Gato implements Animal {
@Override public String fazerSom() { return "Miau!"; }
}
// ── Polimorfismo ──────────────────────────────────
Animal[] animais = { new Cachorro(), new Gato() };
for (Animal a : animais) {
a.apresentar(); // cada um chama sua própria versão
}
// Sou Cachorro e faço: Au!
// Sou Gato e faço: Miau!Programe para interfaces, não implementações: List<String> lista = new ArrayList<>(), não ArrayList<String> lista. Isso facilita trocar a implementação sem alterar o resto do código.