As classes nos dão moldes para criar objetos, a herança permite reutilizar e estender esses moldes, e as interfaces definem contratos de comportamento. Agora, vamos juntar tudo isso com o Polimorfismo, um dos pilares mais poderosos da Programação Orientada a Objetos.

Polimorfismo, em sua essência, significa "muitas formas". Em Java, ele nos permite tratar objetos de diferentes classes de maneira uniforme, desde que essas classes compartilhem uma ancestralidade (seja por herança de uma classe base ou pela implementação de uma interface). É a capacidade de um objeto assumir múltiplas formas durante a execução do programa.



O Que é Polimorfismo?

Imagine que você tem um controle remoto universal. Com ele, você pode ligar uma TV, um aparelho de som ou um DVD player, usando o mesmo botão "Ligar". O controle remoto não precisa saber os detalhes de como cada aparelho liga; ele apenas envia o comando "Ligar", e cada aparelho reage à sua própria maneira.

Em Java, o Polimorfismo funciona de forma semelhante. Ele permite que você declare uma variável de um tipo mais genérico (uma classe pai/ancestral ou uma interface) e atribua a ela um objeto de um tipo mais específico (uma classe filha/descendente ou uma classe que implementa a interface). Quando você chama um método através dessa variável genérica, o Java sabe qual método executar com base no tipo real do objeto que está referenciado naquele momento.

<aside> 💡

Ponto Chave: Polimorfismo é sobre a capacidade de um objeto de assumir diferentes formas, ou de ser tratado como um tipo mais genérico, enquanto mantém e executa seu comportamento específico definido pelo seu tipo real.

</aside>


Por Que Usar Polimorfismo?

O polimorfismo não é apenas um conceito teórico; ele resolve problemas práticos no desenvolvimento de software:


Tipos de Polimorfismo em Java

Existem dois tipos principais de polimorfismo que veremos em Java:

  1. Polimorfismo de Sobrescrita (Runtime Polymorphism / Dynamic Method Dispatch):
  2. Polimorfismo de Sobrecarga (Compile-time Polymorphism):

Neste capítulo, nosso foco principal será no Polimorfismo de Sobrescrita, pois é onde o conceito de "muitas formas" realmente brilha na interação entre classes e interfaces.