AULA 12
MÓDULO 3
abstração
⏱ 50 min
Classes Abstratas
abstract class: contrato parcial com estado. Template Method pattern: esqueleto fixo, passos variáveis. Comparativo completo com interface.
abstract classabstract methodTemplate MethodfinalIS-Ainversão de controle
Classes abstratas — o contrato parcial
Classe abstrata é um contrato parcialmente implementado. Pode ter estado, construtores, métodos completos E métodos abstratos que as subclasses devem implementar.
| Característica | Classe abstrata | Interface |
|---|---|---|
| Instanciar diretamente? | Não | Não |
| Atributos de instância? | Sim | Não (só constantes) |
| Construtores? | Sim | Não |
| Implementação parcial? | Sim | default methods apenas |
| Quantas por classe? | 1 (extends) | Várias (implements) |
| Relação semântica | IS-A | CAN-DO |
Template Method pattern
A superclasse define o esqueleto do algoritmo. As subclasses preenchem os passos variáveis. A superclasse chama métodos das subclasses — inversão de controle.
Hollywood Principle
Don't call us, we'll call you. A subclasse não sabe quando será chamada — a superclasse orquestra. Isso é inversão de controle aplicado ao Template Method.
java
// Template Method — Relatório com esqueleto fixo public abstract class Relatorio { // Método template — final: ninguém pode sobrescrever o esqueleto public final void gerar() { cabecalho(); gerarCorpo(); // passo variável — cada subclasse implementa rodape(); } private void cabecalho() { System.out.println("=== IF Goiano · Campus Rio Verde ==="); } protected abstract void gerarCorpo(); // DEVE ser implementado private void rodape() { System.out.println("Profa. Andrea Barboza Proto Sardi"); } } public class RelatorioVendas extends Relatorio { @Override protected void gerarCorpo() { System.out.println("RELATÓRIO DE VENDAS | Total: R$ 15.840,00"); } } public class RelatorioAlunos extends Relatorio { @Override protected void gerarCorpo() { System.out.println("RELATÓRIO DE ALUNOS | Matriculados: 42"); } } // Polimorfismo + Template Method List.of(new RelatorioVendas(), new RelatorioAlunos()) .forEach(Relatorio::gerar);
quiz · aula 12
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
Por que new Relatorio() não compila?
QUESTÃO 02
Por que o método gerar() usa 'final'?
QUESTÃO 03
Quando escolher classe abstrata em vez de interface?
0/3