Da trilha de Java Este conceito ainda não saiu como card do dia. ir para o card de hoje

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.
TemplateMethodExample.java
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();
    }
}

Exercícios

  1. 1
    Fácil

    Formas geométricas com classe abstrata

    Crie uma classe abstrata Forma com um método abstrato area() e um método concreto descricao() que imprime "Área: " seguido do valor retornado por area(). Depois, implemente as classes Circulo e Quadrado que estendem Forma. No main, crie uma instância de cada e chame descricao().

    Resolver
  2. 2
    Médio

    Template Method para preparo de bebidas

    Implemente uma classe abstrata BebidaQuente com o template method preparar() que executa na ordem: ferverAgua(), preparar() e servir(). Os métodos ferverAgua() e servir() são concretos e imprimem mensagens genéricas. O método preparar() é abstrato. Crie as subclasses Cha e Cafe que implementam preparar() com mensagens específicas. No main, prepare um chá e um café.

    Resolver
  3. 3
    Desafio

    Sistema de relatórios com template method e hook

    Crie uma classe abstrata Relatorio com o template method gerar() que executa: cabecalho(), corpo(), rodape() e, opcionalmente, anexo() (um hook). O hook anexo() tem implementação padrão vazia e pode ser sobrescrito. cabecalho() e rodape() são concretos. corpo() é abstrato. Implemente RelatorioPDF e RelatorioCSV, sendo que apenas RelatorioCSV sobrescreve anexo() para imprimir "Anexo: dados brutos". No main, gere os dois relatórios.

    Resolver

Continue estudando