Durante o estudo da Programação Orientada a Objetos (POO), aprendemos que uma classe pode herdar características de outra utilizando herança e que o polimorfismo permite que objetos diferentes respondam ao mesmo método de maneiras distintas.
Mas existe outra ferramenta extremamente importante na linguagem Java: as interfaces.
As interfaces permitem criar sistemas mais organizados, desacoplados e fáceis de expandir.
Neste artigo, você aprenderá o que são interfaces, quando utilizá-las e como elas funcionam na prática.
O que é uma Interface?
Uma interface pode ser entendida como um contrato.
Ela define quais métodos uma classe deve possuir, mas normalmente não informa como esses métodos serão implementados.
Pense em uma tomada elétrica.
Ela define um padrão de conexão.
Qualquer aparelho que siga esse padrão poderá ser conectado, independentemente de ser:
- uma televisão;
- um computador;
- um carregador de celular;
- uma impressora.
Cada equipamento funciona de maneira diferente, mas todos utilizam o mesmo padrão de conexão.
Em Java, uma interface funciona exatamente dessa forma.
Declarando uma Interface
Uma interface é criada utilizando a palavra-chave interface.
Exemplo:
public interface Animal {
void emitirSom();
}
Observe que não existe implementação do método.
A interface apenas informa que qualquer classe que a implemente deverá possuir esse método.
Implementando uma Interface
Para utilizar uma interface, empregamos a palavra-chave implements.
Exemplo:
public class Cachorro implements Animal {
@Override
public void emitirSom() {
System.out.println("Au Au!");
}
}
Outra implementação:
public class Gato implements Animal {
@Override
public void emitirSom() {
System.out.println("Miau!");
}
}
Perceba que ambas as classes implementam exatamente o mesmo método.
Entretanto, cada uma possui seu próprio comportamento.
Utilizando o Polimorfismo
Uma das maiores vantagens das interfaces aparece quando utilizamos polimorfismo.
Animal animal;
animal = new Cachorro();
animal.emitirSom();
animal = new Gato();
animal.emitirSom();
Saída:
Au Au!
Miau!
A variável continua sendo do tipo Animal.
Quem muda é o objeto armazenado nela.
Outro exemplo: Sistema de Pagamentos
Imagine um sistema de vendas.
O cliente pode pagar utilizando:
- PIX;
- Cartão;
- Boleto.
Todos realizam um pagamento.
Então podemos criar uma interface.
public interface Pagamento {
void pagar(double valor);
}
Implementação do PIX:
public class Pix implements Pagamento {
@Override
public void pagar(double valor) {
System.out.println("Pagamento de R$ " + valor + " via PIX.");
}
}
Implementação do Cartão:
public class Cartao implements Pagamento {
@Override
public void pagar(double valor) {
System.out.println("Pagamento de R$ " + valor + " via Cartão.");
}
}
Agora podemos utilizar qualquer forma de pagamento.
Pagamento pagamento;
pagamento = new Pix();
pagamento.pagar(200);
pagamento = new Cartao();
pagamento.pagar(350);
O restante do programa continua exatamente igual.
Interfaces permitem múltiplas implementações
Uma classe pode herdar apenas uma classe.
Por exemplo:
public class Cachorro extends Animal
Não é possível fazer:
public class Cachorro extends Animal, Mamifero
O Java não permite herança múltipla de classes.
Por outro lado, uma classe pode implementar várias interfaces.
Exemplo:
public interface Voador {
void voar();
}
public interface Nadador {
void nadar();
}
Agora uma classe pode implementar ambas.
public class Pato implements Voador, Nadador {
@Override
public void voar() {
System.out.println("O pato está voando.");
}
@Override
public void nadar() {
System.out.println("O pato está nadando.");
}
}
Essa é uma das principais vantagens das interfaces.
Interface x Classe Abstrata
Esses dois conceitos costumam gerar dúvidas.
Embora sejam parecidos, possuem objetivos diferentes.
| Classe Abstrata | Interface |
|---|---|
| Pode possuir atributos | Não possui atributos de instância (como regra de projeto) |
| Pode possuir métodos implementados | Define principalmente comportamentos |
Utiliza extends | Utiliza implements |
| Pode possuir construtor | Não possui construtor |
| Uma classe só pode herdar uma | Uma classe pode implementar várias |
Quando utilizar uma Interface?
Uma interface é indicada quando várias classes possuem um mesmo comportamento, mas implementam esse comportamento de maneiras diferentes.
Exemplos:
- Pagamento
- Impressão
- Login
- Autenticação
- Exportação de arquivos
- Envio de mensagens
- Conexão com banco de dados
Cada implementação executa a mesma tarefa de forma diferente.
Vantagens das Interfaces
As interfaces oferecem diversos benefícios para o desenvolvimento de software.
- Favorecem o polimorfismo.
- Reduzem o acoplamento entre as classes.
- Facilitam a manutenção do código.
- Tornam o sistema mais flexível.
- Permitem substituir implementações sem alterar o restante do programa.
- Facilitam a realização de testes automatizados.
- São amplamente utilizadas em grandes projetos Java.
Exemplo prático
Imagine um sistema de notificações.
Você pode criar uma interface.
public interface Notificacao {
void enviar(String mensagem);
}
Depois criar várias implementações.
- SMS
- Push Notification
Todas enviam mensagens, mas cada uma faz isso de maneira diferente.
O restante do sistema apenas chama:
notificacao.enviar("Pedido aprovado!");
Não importa qual implementação está sendo utilizada.
Exercício
Crie uma interface chamada Veiculo contendo os métodos:
void acelerar();
void frear();
Depois implemente essa interface nas classes:
- Carro
- Moto
- Bicicleta
No programa principal, crie um vetor de Veiculo e percorra todos os objetos chamando:
veiculo.acelerar();
veiculo.frear();
Observe que cada classe executará esses métodos de maneira diferente.
Conclusão
As interfaces são um dos recursos mais importantes da Programação Orientada a Objetos em Java.
Elas permitem definir contratos entre as classes, favorecem o polimorfismo, reduzem o acoplamento e tornam o software mais organizado e preparado para futuras mudanças.
Em projetos profissionais, é muito comum encontrar sistemas que utilizam interfaces em praticamente todos os módulos, justamente porque elas tornam o código mais reutilizável, flexível e fácil de manter.
Dominar interfaces é um passo fundamental para evoluir como desenvolvedor Java e compreender frameworks amplamente utilizados, como Spring Boot, Jakarta EE e Hibernate.
