AULA 11
MÓDULO 3
polimorfismo
⏱ 55 min
Polimorfismo II: Sobrescrita
Polimorfismo dinâmico: a JVM decide em runtime via vtable. Upcasting seguro. instanceof + pattern matching Java 16+. Template Method.
@Overridelate bindingvtableinstanceofupcastingdowncasting
Polimorfismo dinâmico — late binding
Polimorfismo dinâmico: a JVM decide em runtime qual implementação chamar. O código trabalha com o supertipo sem saber qual subtipo está presente.
conexão com Arquitetura
Em ARQ você viu a vtable (virtual method table). Em Java, cada objeto tem uma referência para a vtable de sua classe real. É late binding — o endereço do método é resolvido em runtime, não em compilação.1
Forma f = new Circulo() — Upcasting implícito — Circulo IS-A Forma, sempre seguro
2
f.calcularArea() — JVM consulta a vtable de Circulo em runtime — chama o correto!
3
List formas — Lista do supertipo com objetos de tipos diferentes
4
for (Forma f : formas) f.calcularArea() — Loop genérico — cada objeto executa sua versão
instanceof e downcasting
Às vezes você precisa do tipo específico. instanceof verifica antes de fazer o cast. Java 16+ tem pattern matching.
downcasting inseguro
Circulo c = (Circulo) forma; — se forma for Retangulo, ClassCastException em runtime! SEMPRE verifique com instanceof antes.
java
// Polimorfismo dinâmico — runtime dispatch abstract class Forma { abstract double calcularArea(); // Template Method: esqueleto na superclasse public void exibir() { System.out.printf("%s → área = %.2f%n", getClass().getSimpleName(), calcularArea()); } } class Circulo extends Forma { double raio; Circulo(double r) { raio = r; } @Override double calcularArea() { return Math.PI * raio * raio; } } class Retangulo extends Forma { double base, altura; Retangulo(double b, double h) { base=b; altura=h; } @Override double calcularArea() { return base * altura; } } // Polimorfismo em ação List<Forma> formas = new ArrayList<>(); formas.add(new Circulo(5)); formas.add(new Retangulo(4, 6)); for (Forma f : formas) f.exibir(); // JVM decide qual versão // instanceof com pattern matching (Java 16+) for (Forma f : formas) { if (f instanceof Circulo c) { System.out.println("Raio = " + c.raio); // c já é Circulo } }
quiz · aula 11
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
Por que List pode conter Circulo e Retangulo?
QUESTÃO 02
O que acontece em f.calcularArea() quando f aponta para Circulo?
QUESTÃO 03
Por que verificar instanceof antes de downcast?
0/3