Aula 8 — Programação Orientada a Objetos
2026-08-30
Interface define o que o objeto faz. Herança define o que ele é.
É o acoplamento mais forte da Orientação a Objetos — e, por isso, o mais perigoso mal utilizado.
Roteiro: mecânica → fragilidade → quando herdar → classes abstratas → Template Method.
extends: a Relação “É-UM”Herança de atributos é incorporação física — não associação externa.
finalSem private + final, a invariante do pai é apenas uma “sugestão”.
Resultado esperado: 3. Resultado real: 6 — contagem duplicada por confiar na mecânica interna do pai.
GerenciadorDeCobrancas extends ListaDeContatos — o gerenciador usa uma lista, não é uma lista.
Vaza métodos do pai (limpar, remover) + poluição de tipo. A cura: composição.
Sem adicionar nada: “objeto zumbi” — polui a taxonomia sem valor.
Por que “o gerenciador usa uma lista, não é uma lista” é o critério certo para decidir entre herança e composição?
Escreva sua resposta e compare com um colega antes de avançar (2 min).
GerenciadorDeCobrancas extends ListaDeContatos expõe métodos do pai que talvez nunca devessem ser públicos no filho.Herança vs. composição — Resposta
GerenciadorDeCobrancas extends ListaDeContatos expõe métodos do pai que talvez nunca devessem ser públicos no filho — é a quebra de encapsulamento citada no exemplo.Voltando à pergunta: o critério certo é comportamental — se a classe só precisa dos métodos prontos, é “usa uma” (composição); se precisa herdar o DNA e ser tratada polimorficamente como o tipo base, é “é uma” (herança).
Pix já escrevia idCobranca direto (via protected) — quebra em runtime, sem aviso em compilação.
null”super esquecido: máquina de estado “zumbi”Como um chassi de carro: rodas, bancos, suspensão — sem motor. new MeioPagamentoBase() nem compila.
Não existe “deserdar” um campo em Java. Herdar estado é compulsório.
Por que não existe uma forma de um filho “recusar” um atributo herdado, mas existe @Override para recusar/substituir um método herdado?
Escreva sua resposta e compare com um colega antes de avançar (2 min).
new, desde que todos os métodos existam.Por que não existe “recusar” um atributo herdado — Resposta
new, desde que todos os métodos existam — o compilador proíbe new numa classe abstrata, completa ou não.@Override), atributos são herdados sem opção de recusa.Voltando à pergunta: métodos são comportamento — a JVM despacha por Late Binding, então sobrescrever (@Override) é só apontar para outra implementação. Atributos são alocação física na Heap, decidida a partir do layout da classe; não existe um mecanismo equivalente de “apontar para outro lugar” para um campo.
final: ninguém muda a ordem. abstract: cada filho preenche só seu detalhe.
“Não nos ligue, nós ligamos para você.” O fluxo pertence ao pai — não ao filho.
Ganho: previsibilidade, manutenibilidade, menos chance de erro do especialista. Risco: esqueleto mal projetado vira camisa de força.
Se o Pix pudesse sobrescrever realizarPagamento() inteiro (em vez de só criarCobrancaEspecifica()), o que exatamente o sistema perderia?
Escreva sua resposta e compare com um colega antes de avançar (2 min).
realizarPagamento() não fosse final, uma subclasse poderia pular a validação ou o registro de log.criarCobrancaEspecifica() é o único ponto que cada subclasse precisa conhecer para se especializar.Se o Pix pudesse sobrescrever realizarPagamento() inteiro — Resposta
realizarPagamento() não fosse final, uma subclasse poderia pular a validação ou o registro de log — é exatamente o risco de não travar o método com final.criarCobrancaEspecifica() é o único ponto que cada subclasse precisa conhecer para se especializar — é o propósito do gancho: isolar o detalhe técnico.Voltando à pergunta: o sistema perderia a garantia de que validação e log sempre acontecem — cada filho poderia reescrever a sequência inteira, reintroduzindo exatamente os bugs (pular passo, esquecer log) que o Template Method existe para prevenir.
Próxima aula: o Princípio da Substituição de Liskov — quando um filho pode substituir o pai com segurança.
UNICAMP — Instituto de Computação