50
Polimorfismo em Java Manoel Afonso Pereira de Lima Filho 10088000901 POO UFPa – Novembro – 2011

Polimorfismo em java

Embed Size (px)

DESCRIPTION

Este slide mostra os principais conceitos do polimorfismo na linguagem Java.

Citation preview

Page 1: Polimorfismo em java

Polimorfismo em Java

Manoel Afonso Pereira de Lima Filho10088000901

POOUFPa – Novembro – 2011

Page 2: Polimorfismo em java

Tópicos

● Introdução● Exemplo de polimorfismo● Herança● Classes abstratas● Referências polimórficas● Contrato● Interface● Considerações finais

Page 3: Polimorfismo em java

Introdução

● A herança é só o começo do polimorfismo.● O polimorfismo fornecerá mais flexibilidade,

clareza e facilidade de manutenção do código.● O principal personagem é a interface.● Permite a “programação no geral”.

Page 4: Polimorfismo em java

Instanciando um objeto

● 1- Especifique o tipo:Cao

● 2- Dê um nome a variável:Cao fido

● 3- Aloque espaço ao objeto:Cao fido new Cao();

● 4- Conecte a instância à variável:Cao fido = new Cao();

Page 5: Polimorfismo em java

Tipos de polimorfismo

● Polimorfismo de Inclusão:Animal an = new Gato();

● Polimorfismo Paramétrico:List<Animal> a = new ArrayList<Animal>();

● Polimorfismo de sobrecarga:public int soma(int a, int b);

public int soma(int[] nums);

Page 6: Polimorfismo em java

Exemplo de Polimorfismo

● Suponha que as classes Cao, Gato e Passaro estendem a classe Animal.

● Suponha que Animal tenha um método chamado barulho().

● O polimorfismo ocorre quando o programa invoca um método por uma variável da superclasse e a versão correta da subclasse é chamada.

● Assim, cada animal emitirá o seu som peculiar.

Page 7: Polimorfismo em java

Herança

● Um dos benefícios da herança é que podemos evitar códigos duplicados os agrupando em uma única classe.

● Podemos sobrescrever os métodos que devem ser mais específicos.

Page 8: Polimorfismo em java

Árvore de herança

Page 9: Polimorfismo em java

Árvore de herança

● É permitido:Gato meuGato = new Gato();

Animal meuCao = new Cao();

● Faz sentido instanciar um animal?Animal anim = new Animal();

Page 10: Polimorfismo em java

Árvore de herança

● Como Animal não é específica o suficiente, ela não deve ser instanciada.

● Assim, basta torná-la abstrata:abstract class Animal {

}

Page 11: Polimorfismo em java

Classes abstratas

● Não é possível instanciá-las, é um erro de compilação. Exemplo:

Animal a = new Animal(); //Errado

● Podemos instanciar apenas as suas classes concretas.

Animal b = new Gato(); //Correto

Page 12: Polimorfismo em java

Classes abstratas

● Definem apenas parte da implementação, isto é, métodos que ainda podem ser úteis para as subclasses.

● Se um método não for genérico o bastante, então o torne abstrato:

public abstract void mover();

● Métodos abstratos não têm corpo e se uma classe possuir algum método abstrato, ela deverá ser abstrata também.

Page 13: Polimorfismo em java

Por que usar abstract?

● Não faz sentido uma classe abstrata possuir todos os métodos implementados porque esse código genérico não será útil para as subclasses.

● Abstract apenas define o modelo do objeto.

Page 14: Polimorfismo em java

Por que usar abstract?

● Poderemos, então, usar um tipo da superclasse como argumento, tipo de retorno ou tipo de matriz de um método.

● Será fácil criar novos subtipos sem ter que reescrever ou adicionar novos métodos para lidar com esses novos tipos.

● Protocolo de um método abstrato:“Todos os subtipos desse tipo têm ESSE método.”

Page 15: Polimorfismo em java

Por que usar abstract?

● Sem um modelo, teríamos de fazer isso para um método fazer os animais emitirem sons:public void somAnimal ( Cachorro c ) {…}

Page 16: Polimorfismo em java

Por que usar abstract?

● Sem um modelo, teríamos de fazer isso para um método fazer os animais emitirem sons:public void somAnimal ( Cachorro c ) {…}

public void somAnimal ( Gato g) {…}

Page 17: Polimorfismo em java

Por que usar abstract?

● Sem um modelo, teríamos de fazer isso para um método fazer os animais emitirem sons:public void somAnimal ( Cachorro c ) {…}

public void somAnimal ( Gato g) {…}

public void somAnimal ( Passaro p) {…}

● E quanto mais classes surgirem, mais sobrecarga haverá!

Page 18: Polimorfismo em java

Por que usar abstract?

● Com um modelo, faríamos apenas isso:

public void somAnimal ( Animal c ) {…}

● Pois todos os animais emitem som, cada um a seu modo.

Page 19: Polimorfismo em java

Classes abstratas

● Lembre-se que um método abstrato não tem corpo.

● Você deverá dar um na primeira subclasse concreta.

● Por exemplo, a classe concreta Passaro deve implementar todos os métodos abstratos de Animal.

Page 20: Polimorfismo em java

Referências polimórficas

● 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 vários tipos.

● Desvantagem: quais métodos pets[1] tem?

Page 21: Polimorfismo em java

Referências polimórficas

Apenas métodos de Object!

Page 22: Polimorfismo em java

Referências polimórficas

● Para usarmos os métodos específicos, temos que converter o objeto para o seu tipo mais específico. Assim:

Gato gt = (Gato) pets[1];

nos dará uma referência ao “gato que está dentro do objeto”.

Page 23: Polimorfismo em java
Page 24: Polimorfismo em java

Referências polimórficas

● Se fizermosGato gt = (Gato) pets[0];

teremos uma referência a um Gato?

Page 25: Polimorfismo em java

Referências polimórficas

● Se fizermosGato gt = (Gato) pets[0];

teremos uma referência a um Gato?● Não! Pois pets[0] foi instanciado como um Cao.

● Isso irá gerar em tempo de execução uma exceção ClassCastException.

Page 26: Polimorfismo em java

Referências polimórficas

● Caso você não tenha certeza do tipo, use a palavra reservada instanceof.

Page 27: Polimorfismo em java

Contrato

● As classes Cao, Gato e Passaro são subclasses de Object.

● A classe Object não define nenhum contrato com as nossas classes.

● Por isso temos que saber de antemão quem é quem antes de fazer a conversão.

Page 28: Polimorfismo em java

Interface

● Interfaces são classes 100% abstratas.● A interface irá definir o contrato entre as

classes, isto é, o comportamento mínimo que elas possuem.

● Assim, você define funcionalidades que outras classes podem obter, independentemente da sua árvore de herança.

Page 29: Polimorfismo em java

Interface

● A interface Animal:

Page 30: Polimorfismo em java

Interface

● Uma classe concreta (Cao).

Page 31: Polimorfismo em java

Interface

Page 32: Polimorfismo em java

Interface

● Com um contrato feito, vamos fazer um array polimórfico:

Page 33: Polimorfismo em java

Interface

● Cada posição do array já é de fato um Cao, um Gato e um Passaro.

Page 34: Polimorfismo em java

Interface

● Cada posição do array já é de fato um Cao, um Gato e um Passaro.

Cada chamada é executada de acordo com o tipo real!

Page 35: Polimorfismo em java

Interface

● Outro exemplo:

Page 36: Polimorfismo em java

Interface

● É garantido que o retorno é uma classe concreta de Animal.

Page 37: Polimorfismo em java

Interface

● Até agora, vimos como interfaces ajudam a tornar o programa mais simples.

● Vamos ver como elas podem tornar o programa flexível.

Page 38: Polimorfismo em java

Interface

● Temos a interface Animal e suas três subclasses.

● Todas com um contrato feito: animais emitem som e se movem.

● Suponha que queiramos agora que apenas os cães sejam capazes de correr em uma competição.

● Isso quer dizer que temos de mudar o contrato.

Page 39: Polimorfismo em java

Interface

● Não podemos adicionar um método correr() na classe Animal pois afetaria a todos.

● Poderíamos adicionar o método diretamente na classe Cao!

● Mas perderíamos qualquer relação entre um cão corredor e um humano corredor (atleta).

Page 40: Polimorfismo em java

Interface

● Veja o diagrama de classes para pessoas:

Page 41: Polimorfismo em java

Interface

● Ora, se um cão corredor e um atleta tem algo em comum, as duas classes poderiam estender uma classe chamada Corredor.

Page 42: Polimorfismo em java

Interface

Page 43: Polimorfismo em java

Interface

Page 44: Polimorfismo em java

Interface

● Herança múltipla é proibido em Java!● Usaremos uma interface.

Page 45: Polimorfismo em java

Interface

Page 46: Polimorfismo em java

Interface

● Agora criamos uma “conexão” entre duas classes de árvores de herança distintas.

● Podemos pensar nisso como “adicionar a funcionalidade de correr” ao cão e ao atleta.

Page 47: Polimorfismo em java

Interface

● Assim, podemos criar um método que faça com que os que correm, corram.

public void fazerCorrer(Corredor c) {…}

● Não importa de qual árvore de herança os objetos pertencem, pois sabemos que os que vierem poderão correr.

Page 48: Polimorfismo em java

Quando usar

● Crie uma classe que não estenda nada (exceto Object) quando esta não passar no teste do É-UM.

● Cria uma subclasse para ter uma versão mais específica de uma classe.

● Crie uma classe abstrata para ter um modelo para suas subclasses, com algum código implementado.

Page 49: Polimorfismo em java

Quando usar

● Crie uma interface para adicionar funcionalidades a uma classe.

● Assim, qualquer classe pode usar um interface, independentemente de sua árvore de herança.

Page 50: Polimorfismo em java

Conclusão

● Classes abstratas fornecem reuso de código, mas são genéricas demais para serem instanciadas.

● Interfaces são classes 100% abstratas e criam o contrato com todos os seus subtipos.

● As interfaces fornecem uma ampla flexibilidade para uso em tipos de retorno, parâmetro ou de matriz.