Você está na página 1de 33

Polimorfismo em Java

Manoel Afonso Pereira de Lima Filho 10088000901 POO UFPa Novembro 2011

Tpicos

Introduo Exemplo de polimorfismo Herana Classes abstratas Referncias polimrficas Contrato Interface Consideraes finais

Introduo

A herana s o comeo do polimorfismo. O polimorfismo fornecer mais flexibilidade, clareza e facilidade de manuteno do cdigo. O principal personagem a interface. Permite a programao no geral.

Instanciando um objeto

1- Especifique o tipo:
Cao

2- D um nome a varivel:
Cao fido

3- Aloque espao ao objeto:


Cao fido new Cao();

4- Conecte a instncia varivel:


Cao fido = new Cao();

Exemplo de Polimorfismo

Suponha que as classes Cao, Gato e Passaro estendem a classe Animal. Suponha que Animal tenha um mtodo chamado barulho(). O polimorfismo ocorre quando o programa invoca um mtodo por uma varivel da superclasse e a verso correta da subclasse chamada. Assim, cada animal emitir o seu som peculiar.

Herana

Um dos benefcios da herana que podemos evitar cdigos duplicados os agrupando em uma nica classe. Podemos sobrescrever os mtodos que devem ser mais especficos.

rvore de herana

rvore de herana

permitido: Gato meuGato = new Gato(); Animal meuCao = new Cao(); Faz sentido instanciar um animal? Animal anim = new Animal();

rvore de herana

Como Animal no especfica o suficiente, ela no deve ser instanciada. Assim, basta torn-la abstrata: abstract class Animal { }

Classes abstratas

No possvel instanci-las, um erro de compilao. Exemplo: Math m = new Math(); //Errado Podemos instanciar apenas as suas classes concretas.

Classes abstratas

Definem apenas parte da implementao. Mtodos tambm podem ser abstratos: public abstract void mover(); Se uma classe possuir algum mtodo abstrato, ela dever ser abstrata tambm.

Por que usar abstract?

No faz sentido uma classe abstrata possuir todos os mtodos implementados porque esse cdigo genrico no ser til para as subclasses. Abstract apenas define o modelo do objeto.

Por que usar abstract?

Poderemos, ento, usar um tipo da superclasse como argumento, tipo de retorno ou tipo de matriz de um mtodo. Ser fcil criar novos subtipos sem ter que reescrever ou adicionar novos mtodos para lidar com esses novos tipos. Protocolo de um mtodo abstrato: Todos os subtipos desse tipo tm ESSE mtodo.

Classes abstratas

Lembre-se que um mtodo abstrato no tem corpo. Voc dever dar um na primeira subclasse concreta. Por exemplo, a classe concreta Passaro deve implementar todos os mtodos abstratos de Animal.

Referncias polimrficas

Ocorre quando uma superclasse aponta para um dos seus subtipos. Object pets[] = new Object[3]; pets[0] = new Cao(); pets[1] = new Gato(); pets[2] = new Passaro(); Vantagem: Um mesmo array armazena vrios tipos. Desvantagem: quais mtodos pets[1] tem?

Referncias polimrficas

Apenas mtodos de Object!

Referncias polimrficas

Para usarmos os mtodos especficos, temos que converter o objeto para o seu tipo mais especfico. Assim: Gato gt = (Gato) pets[1]; nos dar uma referncia ao gato que est dentro do objeto.

Referncias polimrficas

Se fizermos Gato gt = (Gato) pets[0]; teremos uma referncia a um Gato?

Referncias polimrficas

Se fizermos Gato gt = (Gato) pets[0]; teremos uma referncia a um Gato? No! Pois pets[0] foi instanciado como um Cao. Isso ir gerar em tempo de execuo uma exceo ClassCastException.

Referncias polimrficas

Caso voc no tenha certeza do tipo, use a palavra reservada instanceof.

Contrato

As classes Cao, Gato e Passaro so subclasses de Object. A classe Object no define nenhum contrato com as nossas classes. Por isso temos que saber de antemo quem quem antes de fazer a converso.

Interface

A interface ir definir o contrato entre as classes, isto , o comportamento mnimo que elas possuem. Interfaces so classes 100% abstratas.

Interface

A interface Animal:

Interface

Uma classe concreta (Cao).

Interface

Interface

Com um contrato feito, vamos fazer um array polimrfico:

Interface

Cada posio do array j de fato um Cao, um Gato e um Passaro.

Interface

Cada posio do array j de fato um Cao, um Gato e um Passaro.

Cada chamada executada de acordo com o tipo real!

Interface

Outro exemplo:

Interface

garantido que o retorno uma classe concreta de Animal.

Interface

Interfaces so usadas para adicionar funcionalidades a uma classe. Assim, qualquer classe pode usar um interface, independentemente de sua rvore de herana.

Concluso

Classes abstratas fornecem reuso de cdigo, mas so genricas demais para serem instanciadas. Interfaces so classes 100% abstratas e criam o contrato com todos os seus subtipos. As interfaces fornecem uma ampla flexibilidade para uso em tipos de retorno, parmetro ou de matriz.

Você também pode gostar