Polimorfismo em Java: o que é, pra que serve, como e onde usar

Agora que aprendemos os conceitos mais importantes e vimos o uso da Herança em Java, vamos estudar outra características  marcante da programação Java e, de uma maneira mais geral, da programação orientada a objetos: o polimorfismo.

Com o polimorfismo vamos ter um controle maior sobre as subclasses sem ter que nos preocupar especificamente com cada uma delas, pois cada uma terá autonomia para agir de uma meneira diferente.


Definição de polimorfismo em Java

Traduzindo, do grego, ao pé da letra, polimorfismo significa "muitas formas".
Essas formas, em nosso contexto de programação, são as subclasses/objetos criados a partir de uma classe maior, mais geral, ou abstrata.
Polimorfismo é a capacidade que o Java nos dá de controlar todas as formas de uma maneira mais simples e geral, sem ter que se preocupar com cada objeto especificamente.

Mais uma vez, somente pela definição é muito complicado de entender.
Vamos partir para algo comum e de preocupação máxima de nosso curso de Java online: exemplos práticos.

Exemplo 1 de Polimorfismo: Aumento no preço dos carros

Vamos pra nossa loja de carros, onde você é o programador Java de lá.
Lembra que aprendeu, através de exemplos, a criar uma classe bem genérica, chamada "Carro"?
E depois criamos várias subclasses, de fuscas, ferraris, gols etc.

Imagine que, todo ano, todos na empresa tem um aumento.
A Ferrari teve aumento de 5%. o fusca terá aumento de 3% e o gol terá de 1%.

Note que, embora todos sejam "Carro", cada objeto terá que calcular seu aumento de forma diferente, pois terão diferentes valores de aumento. Como criar, então, um método na superclasse que atenda todas essas necessidades diferentes?

Não é na superclasse que se resolve, mas nas subclasses, criando o método 'aumento()' em cada uma.
Ou seja, vai criar vários métodos, e para fazer o aumento realmente ocorrer de maneira correta, é só invocar o método do objeto específico.

Então: objetoFerrari.aumento() é diferente de objetoFusca.aumento().


Note que usamos o mesmo nome do método para todas as subclasses, porém cada método é diferente um do outro.
Isso é o polimorfismo em ação: embora todos os objetos sejam "Carro", eles terão uma forma diferente de agir, pois implementamos os métodos de maneira diferente.
Apenas invocamos, e todo objeto sabe exatamente o que fazer.

Por isso o nome polimorfismo, pois cada objeto terá sua forma própria de como rodar, pois os métodos 'aumento()' dos objetos são diferentes.

Outra vantagem do polimorfismo: você já viu que, criando o método aumento() em toda as subclasses, ela agirão de maneira independente da superclasse e diferente de outros objetos.
Agora, quando chegar outro carro na sua loja você de adicionar o método aumento(), e terá um novo tipo de objeto, sem grandes alterações no código.


Exemplo 2 de Polimorfismo: animais mugindo, latindo, berrando...



Imagine que você é o criador do joguinho Colheita feliz ou Fazenda Feliz (sei lá), onde terá vários bichos nesse jogo.
Como você é esperto, vai logo abstrair e criar uma classe "Animal" com as características que todos tem: idade, peso, espécie etc.

Porém, nesse game, os animais fazem seu som característico: o cachorro late, o gato mia, o pinto pia, a vaca muge etc.
E aí? Como criar um método na superclasse que sirva para todos estes animais?
Ora, não cria, pois cada animal age diferente nesse aspecto.

Veja, polimorfismo é isso: embora objetos sejam da mesma superclasse, vão agir de maneira diferente em algum aspecto. Ou seja, terão várias(poli) formas diferentes (morfismo).

A saída é criar um método chamado 'som()' na superclasse (só o cabeçalho, como veremos nos próximos tutoriais) e em cada subclasse criar um método diferente, que caracterize cada bicho.

Veja que se não fizéssemos isso e invocássemos os métodos: vaca.som(), cachorro.som(), gato.som(), todos iriam fazer o mesmo barulho.
Com o polimorfismo: vaca.som() faria a vaquinha mugir, cachorro.som() faria o cachorro latir e gato.som() faria o objeto miar.
Porém, todos continuam sendo, também, objetos da classe "Animal".

E quando chegar mais animais na sua fazenda, adicione o método som() nesse animal, de modo que ele poderá agir conforme suas características.


Resumindo: polimorfismo permite que uma mesma superclasse possua subclasses com características - ou formas - diferentes.

24 comentários:

  1. Muito bom cara! Bem explicado, simples de entender! Muito obrigado pela ajuda! Abraço!

    ResponderExcluir
  2. O senhor e uns dos caras que nos iniciantes devemos dar muito obrigado, pois o fato do senhor compartilhar o seu conhecimento dessa forma e maravilhoso para os poucos que busca uma ajuda. Mais uma vez obrigado pelo seu trabalho.

    ResponderExcluir
  3. Vlw, muito Bom.. Continue Assim :D

    ResponderExcluir
  4. Todos citam o polimorfismo como um bicho de sete cabeças, mas vocês deixaram bem fácil de entender o conceito (que é o mais importante).
    Parabéns pelo excelente trabalho!

    ResponderExcluir
  5. Excelente! Casei de assistir vídeo aulas e não entender.Muito bom sua explicação

    ResponderExcluir
  6. Muito bom Parabéns!!!! Entendi o conceito. obrigado!!!

    ResponderExcluir
  7. Waaa muito bem explicado! Obrigada ( ̄▽ ̄)ノ

    ResponderExcluir
  8. Muito bom como o resto de seu tutorial!

    ResponderExcluir
  9. Parabéns, excelente conteúdo.
    Explicação clara e de fácil entendimento.

    ResponderExcluir
  10. Parabéns!!! Tem um dom de explicar as coisas que é uma beleza!!! Deus te abençoe grandemente por compartilhar seu grande (e ótimo) conhecimento! abraços! ô/

    ResponderExcluir
  11. Muito bom este seu trabalho! Parabéns.

    ResponderExcluir
  12. Muito bom.. Vai ser muito útil ..

    ResponderExcluir
  13. Muito bem explicado excelente. Finalmente alguém com jeito para explicar isso.
    Obrigado

    ResponderExcluir
  14. Só consegui entender com seu texto, obrigado !

    ResponderExcluir
  15. Cara, estava lendo um livro e não estava entendendo esse conceito, com sua explicação consegui compreender de forma mais clara.
    Obrigado pela dica.

    ResponderExcluir
  16. Muito bom cara! Valeu... Finalmente entendi. :)

    ResponderExcluir
  17. Queria agradecer pela bela explicação, muito obrigado mesmo!

    ResponderExcluir
  18. Parabéns pela didática e clara explicação. Estou adorando o Java Progressivo, estou aprendendo muita coisa de forma bem simples graças a você(s). Obrigado!!!

    ResponderExcluir
  19. Muito bom a linguagem e os exemplos que usou obrigado ficou mais claro fácil de entender, todos os que sabem dizem e fácil fácil mas para quem esta aprendendo como eu muitas vezes olhamos e olhamos mas não enxergamos as mesmas coisas como quem sabe!

    ResponderExcluir