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