Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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:

Grégory disse...

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

milagre disse...

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.

Anônimo disse...

Vlw, muito Bom.. Continue Assim :D

Anônimo disse...

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!

Wendell disse...

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

Genker disse...

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

Unknown disse...

Waaa muito bem explicado! Obrigada ( ̄▽ ̄)ノ

Junior Oliveira disse...

Muito bom como o resto de seu tutorial!

Anônimo disse...

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

Anônimo disse...

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! ô/

Anônimo disse...

Muito bom este seu trabalho! Parabéns.

Unknown disse...

Muito bom.. Vai ser muito útil ..

Pascoal disse...

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

Anônimo disse...

Só consegui entender com seu texto, obrigado !

Anônimo disse...

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.

Unknown disse...

Muuuuiito bom! Ótima explicação

Unknown disse...

Muito Bom!!! Obrigado!!!

Unknown disse...

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

Unknown disse...

Ótima sua explicação parabéns!

Unknown disse...

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

Unknown disse...

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!!!

Feito para gastar disse...

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!

Unknown disse...

Ótima explicação !!

Unknown disse...

Excelente explicação!

Contribuir com o Java Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo


Tutoriais de Java