polimorfismo em java
DESCRIPTION
Este slide mostra os principais conceitos do polimorfismo na linguagem Java.TRANSCRIPT
![Page 1: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/1.jpg)
Polimorfismo em Java
Manoel Afonso Pereira de Lima Filho10088000901
POOUFPa – Novembro – 2011
![Page 2: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/8.jpg)
Árvore de herança
![Page 9: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/9.jpg)
Á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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/10.jpg)
Á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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/21.jpg)
Referências polimórficas
Apenas métodos de Object!
![Page 22: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/23.jpg)
![Page 24: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/24.jpg)
Referências polimórficas
● Se fizermosGato gt = (Gato) pets[0];
teremos uma referência a um Gato?
![Page 25: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/26.jpg)
Referências polimórficas
● Caso você não tenha certeza do tipo, use a palavra reservada instanceof.
![Page 27: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/29.jpg)
Interface
● A interface Animal:
![Page 30: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/30.jpg)
Interface
● Uma classe concreta (Cao).
![Page 31: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/31.jpg)
Interface
![Page 32: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/32.jpg)
Interface
● Com um contrato feito, vamos fazer um array polimórfico:
![Page 33: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/33.jpg)
Interface
● Cada posição do array já é de fato um Cao, um Gato e um Passaro.
![Page 34: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/35.jpg)
Interface
● Outro exemplo:
![Page 36: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/36.jpg)
Interface
● É garantido que o retorno é uma classe concreta de Animal.
![Page 37: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/39.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/40.jpg)
Interface
● Veja o diagrama de classes para pessoas:
![Page 41: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/42.jpg)
Interface
![Page 43: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/43.jpg)
Interface
![Page 44: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/44.jpg)
Interface
● Herança múltipla é proibido em Java!● Usaremos uma interface.
![Page 45: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/45.jpg)
Interface
![Page 46: Polimorfismo em java](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/46.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/47.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/48.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/49.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052601/559704291a28ab724f8b477a/html5/thumbnails/50.jpg)
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.