Java POO Intermediário
Classes abstratas
Em Java, uma classe abstrata é uma classe que não pode ser instanciada diretamente e serve como base para outras classes. Ela pode conter métodos abstratos (sem implementação) e métodos concretos (com implementação). O objetivo é definir um modelo comum, deixando detalhes específicos para as subclasses.
Métodos abstratos são declarados com a palavra-chave abstract e não possuem corpo. Eles obrigam as subclasses concretas a fornecer uma implementação. Já os métodos concretos podem ser herdados e reutilizados.
Um uso clássico é o Template Method: a classe abstrata define o esqueleto de um algoritmo, com passos variáveis implementados por métodos abstratos que as subclasses preenchem. Isso promove reuso e inversão de controle.
Use classes abstratas quando você tem um conceito genérico que não faz sentido instanciar sozinho, mas que compartilha estado e comportamento entre várias subclasses. Prefira interfaces quando precisar apenas de contrato sem estado.
Pontos-chave
- Classes abstratas não podem ser instanciadas com
new. - Métodos abstratos não têm corpo e devem ser implementados pelas subclasses concretas.
- Uma classe abstrata pode ter métodos concretos e campos de instância.
- O padrão Template Method define a estrutura do algoritmo na superclasse e delega passos às subclasses.
- Use classes abstratas para compartilhar código e estado; interfaces para contratos puros.
abstract class ProcessadorDePagamento {
// Template method: define a sequência de passos
public final void processar() {
validar();
debitar();
notificar();
}
protected abstract void validar();
protected abstract void debitar();
// Método concreto reutilizado por todas as subclasses
protected void notificar() {
System.out.println("Notificação enviada ao cliente.");
}
}
class PagamentoCartao extends ProcessadorDePagamento {
@Override
protected void validar() {
System.out.println("Validando cartão de crédito...");
}
@Override
protected void debitar() {
System.out.println("Debitando valor no cartão.");
}
}
class PagamentoBoleto extends ProcessadorDePagamento {
@Override
protected void validar() {
System.out.println("Validando código de barras...");
}
@Override
protected void debitar() {
System.out.println("Registrando pagamento de boleto.");
}
}
public class TemplateMethodExample {
public static void main(String[] args) {
ProcessadorDePagamento p1 = new PagamentoCartao();
p1.processar();
System.out.println("---");
ProcessadorDePagamento p2 = new PagamentoBoleto();
p2.processar();
}
}