Você está na página 1de 13

Escola Tcnica Helipolis Tcnico em Informtica

Gilson de Jesus Aquino Tamires Merce

Polimorfismo em Java:
Sobrecarga, Sobreposio e Incluso.

So Paulo 2013

POLIMORFISMO EM JAVA
Agora que aprendemos os conceitos mais importantes e vimos o uso da Herana em Java, vamos estudar outras caractersticas marcantes da programao Java e, de uma maneira mais geral, da programao 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 maneira diferente. Definio de polimorfismo em Java Traduzindo, do grego, ao p da letra, polimorfismo significa "muitas formas". Essas formas, em nosso contexto de programao, so 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 definio muito complicado de entender. Vamos partir para algo comum e de preocupao mxima de nosso curso de Java online: exemplos prticos. Exemplo 1 de Polimorfismo: Aumento no preo dos carros Vamos pra nossa loja de carros, onde voc o programador Java de l. Lembra que aprendeu, atravs de exemplos, a criar uma classe bem genrica, chamada "Carro"? E depois criamos vrias 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 tero diferentes valores de aumento. Como criar, ento, um mtodo na superclasse que atenda todas essas necessidades diferentes? No na superclasse que se resolve, mas nas subclasses, criando o mtodo 'aumento()' em cada uma. Ou seja, vai criar vrios mtodos, e para fazer o aumento realmente ocorrer de maneira correta, s invocar o mtodo do objeto especfico. Ento: objetoFerrari.aumento() diferente de objetoFusca.aumento(). Note que usamos o mesmo nome do mtodo para todas as subclasses, porm cada mtodo diferente um do outro.

Isso o polimorfismo em ao: embora todos os objetos sejam "Carro", eles tero uma forma diferente de agir, pois implementamos os mtodos de maneira diferente. Apenas invocamos, e todo objeto sabe exatamente o que fazer. Por isso o nome polimorfismo, pois cada objeto ter sua forma prpria de como rodar, pois os mtodos 'aumento()' dos objetos so diferentes. Outra vantagem do polimorfismo: voc j viu que, criando o mtodo aumento() em toda as subclasses, ela agiro de maneira independente da superclasse e diferente de outros objetos. Agora, quando chegar outro carro na sua loja voc de adicionar o mtodo aumento(), e ter um novo tipo de objeto, sem grandes alteraes no cdigo. Exemplo 2 de Polimorfismo: animais mugindo, latindo, berrando... Imagine que voc o criador do joguinho Colheita feliz ou Fazenda Feliz (sei l), onde ter vrios bichos nesse jogo. Como voc esperto, vai logo abstrair e criar uma classe "Animal" com as caractersticas que todos tem: idade, peso, espcie etc. Porm, nesse game, os animais fazem seu som caracterstico: o cachorro late, o gato mia, o pinto pia, a vaca muge etc. E a? Como criar um mtodo na superclasse que sirva para todos estes animais? Ora, no cria, pois cada animal age diferente nesse aspecto. Veja, polimorfismo isso: embora objetos sejam da mesma superclasse, vo agir de maneira diferente em algum aspecto. Ou seja, tero vrias(poli) formas diferentes (morfismo). A sada criar um mtodo chamado 'som()' na superclasse (s o cabealho, como veremos nos prximos tutoriais) e em cada subclasse criar um mtodo diferente, que caracterize cada bicho. Veja que se no fizssemos isso e invocssemos os mtodos: 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. Porm, todos continuam sendo, tambm, objetos da classe "Animal". E quando chegar mais animais na sua fazenda, adicione o mtodo som() nesse animal, de modo que ele poder agir conforme suas caractersticas.

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

POLIMORFISMO DE SOBRECARGA
Polimorfismo de sobrecarga permite que um mtodo de determinado nome tenha comportamentos distintos, em funo de diferentes parmetros (1) que ele recebe. Cada mtodo difere no nmero e no tipo de parmetros. Exemplo: Considere uma classe Maior capaz de calcular e retornar o maior entre dois nmeros de tipos diferentes. A Listagem 1 ilustra o cdigo de tal classe. (1) Lembrando: parmetros so as variveis que esto dentro dos parntesis na declarao do mtodo.

Listagem 1 - Polimorfismo de Sobrecarga com tipos de parmetros diferentes Veja no exemplo uma aplicao prtica do uso do polimorfismo de sobrecarga. Observe que temos vrios mtodos com o mesmo nome, no caso calcMaior(), cujo objetivo indicar qual o maior dentre dois nmeros. O que diferencia cada um deles o tipo de parmetros. No primeiro mtodo, os parmetros so do tipo int. J no segundo mtodo, os dois parmetros so float. Finalmente, no terceiro mtodo, os parmetros so do tipo double. Esses mtodos fazem a mesma coisa (calculam o maior entre dois nmeros), mas de maneiras diferentes, pois recebem e retornam tipos diferentes. Observe agora o ltimo mtodo calcMaior() declarado na classe Maior. Esse mtodo, apesar de diferenciar do anterior pelo tipo de retorno de double para int, no ser aceito

pelo compilador Java como um polimorfismo de sobrecarga. O motivo que j existe um mtodo com o nome calcMaior() e dois parmetros do tipo double. Esse mtodo seria aceito se houvesse um nmero diferente de parmetro ou um dos parmetros tivesse o tipo diferente de double. Como mostra a Listagem 2.

Listagem 2 - Polimorfismo de sobrecarga com tipo e nmero de parmetros diferentes Observe que agora os dois ltimos mtodos possuem nmero e tipos de parmetros diferentes dos mtodos anteriores.

A SOBRECARGA E OS CONSTRUTORES
O polimorfismo de sobrecarga normalmente acontece sobre os mtodos construtores, pois comum para uma classe ter vrias maneiras de instanci-la. A Listagem 3 ilustra um exemplo de polimorfismo de sobrecarga nos construtores da classe Pessoa. Observe que so declarados 3 construtores e todos eles tm o mesmo nome da classe. Entretanto, cada um deles recebe um nmero diferente de parmetros. Assim, durante a criao de objetos do tipo Pessoa em um mtodo main, por exemplo, o construtor que ser chamado ir depender da quantidade e parmetros passados durante a invocao do comando new.

Listagem 3 - Polimorfismo de sobrecarga de construtores A sobrecarga e a converso Converso e sobrecarga frequentemente andam lado a lado.

A Converso a capacidade de um tipo ser convertido em outro tipo de maneira automtica ou pela fora bruta tambm chamada de coero.

Veja o quadro abaixo sobre converso de tipos primitivos.

Converso de Tipos Primitivos Java converte um tipo de dado em outro sempre que isso for apropriado. As converses ocorrem automaticamente quando h garantia de no haver perda de informao. As converses automticas so permitidas para tipos de maior preciso e para tipos de menor preciso. Exemplos de Converses Automticas

So permitidas as converses do tipo byte para o tipo short, de short para int, e assim sucessivamente, at chegar o tipo de maior preciso, que o double. Observe tambm algumas converses permitidas baseadas nas variveis criadas pelas letras no quadro Algumas converses legais.

A converso tambm pode fazer com que um mtodo parea como se fosse polimrfico. A converso ocorre quando um argumento de um tipo convertido para o tipo esperado, internamente. Por exemplo, suponha que a classe Maior, descrita anteriormente, tivesse apenas atributos e mtodos para lidar com o tipo primitivo, conforme ilustra a Listagem 4.

Listagem 4 - Classe Maior com o mtodo calcMaior para os tipos int e float Agora suponha que em uma aplicao (mtodo main) usamos um objeto da classe Maior, mas, na chamada de seu mtodo calcMaior, fossem passados, ao invs de valores do tipo float, valores do tipoint., conforme ilustra a Listagem 5.

Listagem 5 - Converso automtica de tipos primitivos Observe que, apesar do mtodo esperar parmetros do tipo float, o compilador aceitou receber parmetros do tipo int, e os converteu automaticamente para float dentro do mtodo calcMaior da classe Maior apresentada na Listagem 5. Nesse caso, parece um caso de polimorfismo de sobrecarga, mas na verdade o que acontece uma converso automtica de tipos.

POLIMORFISMO DE SOBREPOSIO
Polimorfismo de sobreposio a redefinio de mtodos em classes descendentes. Ou seja, um mtodo de uma classe filha com o mesmo nome de um mtodo de uma classe me ir sobrepor esse ltimo. Quando ocorre a sobreposio de um mtodo de uma classe filha em cima do mtodo da classe pai, no quer dizer que o mtodo da classe pai foi destrudo. A classe filha herda sempre o mtodo como um mtodo recursivo da classe pai, ou seja, nada impede que o mtodo da classe filha utilize o mtodo da classe herdada. Como pode ser observado na hierarquia de classes apresentada, existe: (i) uma classeA, que implementa um metodoX(); (ii)uma classeB, que implementa um mtodo com o mesmo nome; e, finalmente, (iii)uma classeC, que implementa um mtodoY().

Sobreposio de mtodos em uma hierarquia de Herana

O que aconteceria se fosse solicitado ao Objeto1 da classeC a execuo do metodoX() ? Esse mtodo ser procurado na hierarquia da classe instanciada pelo Objeto1. Devemos observar que, nesse caso, o mtodoX() que tambm implementado na ClasseB, foi encontrado primeiro que o metodoX() da ClasseA. Nesse caso, o mtodo que de fato ser executado ser o da ClasseB. E nesse caso, o metodoX() da ClasseA jamais ser alcanado, a menos que seja criado um objeto da ClasseA. Dizemos ento que ocorreu uma sobreposio de mtodo ou um polimorfismo de sobreposio. O mtodoX da classeB sobreps (ou redefiniu) o mtodo de sua classe me.

O POLIMORFISMO DE SOBREPOSIO EM JAVA


Considere que a classe Brinquedo possui como descendentes as classes Carro, Avio e Barco, conforme ilustra a figura.

Hierarquia de Herana da classe Brinquedo

Observe que as classes filhas sobrepem o mtodo mover() da classe Brinquedo. Considerando o mtodo mover() de cada classe filha, como poderamos chamar o mtodo mover() do brinquedo (classe) correto? Ou seja, como o ControleRemoto saber que mtodo mover ele deve chamar se ele tem disponvel trs tipos de mover diferentes (um para cada brinquedo)? Voc lembra que na primeira vez que apresentamos esse exemplo dissemos que a nica restrio para um controle remoto to verstil seria que quando criado o controle remoto, ele receberia o tipo de brinquedo que iria acionar em um dado instante? Pois , a que est o segredo para o controle remoto saber qual deve ser o mtodo mover() que ele deve chamar (CORRER, NAVEGAR ou VOAR). O mtodo construtor da classe ControleRemoto exige que o controle para ser inicializado receba um parmetro do tipoBrinquedo. E isso acontece quando o atributo brinquedo do ControleRemoto recebe b(um objeto do tipo Brinquedo). Ento, quando o mtodo mover() da classe ControleRemoto for acionado (isso significa dizer que o boto mover foi apertado), esse faz com que seu atributo brinquedo chame o mtodo mover()correto, dependendo do tipo de Brinquedo que recebeu quando foi instanciado. O exemplo abaixo mostra como fica a classe Principal que instancia um objeto controleRemoto e um objeto carro para ser controlado automaticamente.

Classe Principal com o mtodo main Observe que criamos um brinquedo do tipo Carro, e quando criamos o ControleRemoto, enviamos esse objeto carro para o objeto controleRemoto atravs da chamada ao seu construtor. Assim, quando acionado o comando controleRemoto.mover(), ser chamado o mtodo mover() do carro. O resultado ser a impresso da palavra: CORRER

POLIMORFISMO DE INCLUSO
Polimorfismo de incluso usa a capacidade de substituio da Herana, de uma classe me por qualquer classe descendente, para permitir um comportamento polimrfico nos mtodos que usam a classe me. No exemplo visto na seo anterior, veja a classe Principal na Listagem 8, onde criamos um objeto do tipo Carro e outro do tipo ControleRemoto, ns utilizamos o comportamento polimrfico do polimorfismo de incluso. Fizemos isso quando substitumos a classe Brinquedo (me) pela classe Carro (filha) dentro da classe ControleRemoto. Assim, o atributo interno do tipo Brinquedo da classe ControleRemoto pode receber qualquer objeto que seja de uma classe filha de Brinquedo. Para entender melhor o que aconteceu.

Hierarquia da Classe Brinquedo e da classe Controle Remoto

Observe que a classe ControleRemoto est relacionada com a classe Brinquedo, pois possui um atributo do tipo Brinquedo. Mas, como as classes Carro, Avio e Barco so descendentes de Brinquedo, elas podem substituir a classe Brinquedo em qualquer mtodo que a utilize. Nesse caso, isso foi feito explicitamente, atravs da passagem de um objeto da classe Carro para o mtodo construtor de ControleRemoto na Classe Principal. Caso o programador deseje mudar o controle remoto para interagir com algum outro tipo de brinquedo, bastaria passar um objeto da classe Avio ou Barco na chamada ao construtor da classe ControleRemoto. A capacidade do objeto (brinq) do tipo Brinquedo da classe ControleRemoto de receber qualquer um objeto de subclasses da classe Brinquedo que caracteriza o polimorfismo de incluso.

Referncias: http://www.metropoledigital.ufrn.br/aulas/disciplinas/poo/au la_12.html