Polimorfismo

713 views

Published on

Conceitos básicos sobre Polimorfismo em Linguagem Java

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
713
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Polimorfismo

  1. 1. Universidade Presbiteriana Mackenzie   Aula  4:  Polimorfismo   Prof. Ms. Daniel Arndt Alves Faculdade  de  Computação  e  Informá<ca   Computação e Informática Faculdade de Linguagem  de   Programação  II   Polimorfismo   1  Daniel  Arndt  Alves  
  2. 2. Tópicos  da  Aula   •  Polimorfismo   – Exemplos  de  Polimorfismo   – Vantagens  do  Polimorfismo   – Tipos  de  Polimorfismo   •  Métodos  Abstratos   •  Classes  Abstratas   •  Vinculação  Dinâmica   Polimorfismo   2  Daniel  Arndt  Alves  
  3. 3. Tópicos  da  Aula   •  Hierarquia  Empregado – Classe  Empregado – Classe  EmpregadoHorista – Classe  EmpregadoPorComissao – Classe  EmpregadoFixoMaisComissao •  Processamento  Polimórfico   – Operador  instanceof – A  Classe  Class Polimorfismo   3  Daniel  Arndt  Alves  
  4. 4. Tópicos  da  Aula   •  Exemplo  de  Polimorfismo   •  CasHng   – Cast   – Upcast   – Downcast   •  Métodos  Final •  Classes  Final Polimorfismo   4  Daniel  Arndt  Alves  
  5. 5. Polimorfismo   •  Permite  que  um  método  produza  resultados   diferentes,  dependendo  do  objeto  ao  qual  é   aplicado.   •  A  mesma  invocação  pode  produzir  “muitas   formas”  de  resultados.   Daniel  Arndt  Alves   Polimorfismo   5  
  6. 6. Polimorfismo   •  Um  nome  para  várias  formas,  ou  ainda,  um  nome   e  várias  implementações  (vários  métodos  com  o   mesmo  nome).   •  Capacidade  de  uma  referência  de  variável  mudar   seu  comportamento  de  acordo  com  o  objeto  a   que  ela  está  conectada.   –  Isto  permite  que  objetos  diferentes,  de  subclasses   disHntas,  sejam  vistos  como  objetos  de  uma  mesma   superclasse  –  o  método  apropriado  a  ser  executado   será  escolhido  automaHcamente,  baseado  na   subclasse  que  o  objeto  pertence   Daniel  Arndt  Alves   Polimorfismo   6  
  7. 7. Exemplos  de  Polimorfismo   •  Sobrecarga  de  um  método   – Mesmo  nome,  parâmetros  diferentes   •  setData(int dia, int mes, int ano); •  setData(int dia, int mes, int ano, int hora, int minuto, int segundo);   Daniel  Arndt  Alves   Polimorfismo   7  
  8. 8. Exemplos  de  Polimorfismo   •  Sobrescrita  de  um  método   – Uma  subclasse  redefine  um  comportamento  de   sua  superclasse   •  umaPessoa.toString(); •  umEmpregado.toString(); •  umGerente.toString(); Daniel  Arndt  Alves   Polimorfismo   8  
  9. 9. Exemplos  de  Polimorfismo   •  Vinculação  dinâmica  (ou  tardia)   – Dynamic  Binding,  Late  Binding   – O  método  a  ser  chamado  só  pode  ser   determinado  em  tempo  de  execução   Daniel  Arndt  Alves   Polimorfismo   9  
  10. 10. Vantagens  do  Polimorfismo   •  Simplicidade   – Quando  necessário  escrever  um  código  que   manipula  uma  família  de  Hpos,  o  código  pode   ignorar  detalhes  específicos  de  cada  Hpo   – Mesmo  que  o  código  aparente  estar  manipulando   um  objeto  do  Hpo  da  classe-­‐mãe,  o  objeto  na   verdade  pode  ser  do  Hpo  da  classe-­‐mãe,  mas   também  do  Hpo  das  classes-­‐filhas   – Isso  torna  o  código  mais  fácil  de  se  escrever  e  de   se  entender   Daniel  Arndt  Alves   Polimorfismo   10  
  11. 11. Vantagens  do  Polimorfismo   •  Escalabilidade   – Num  momento  futuro,  outras  classes  poderão  ser   adicionadas  à  família  de  Hpos,  sendo  que  os  seus   objetos  executarão  seu  código  específico.   Daniel  Arndt  Alves   Polimorfismo   11  
  12. 12. Tipos  de  Polimorfismo   •  Sobrecarga  (overloading)   – Ocorre  na  mesma  classe  ou  entre  classe-­‐mãe  e   classe-­‐filha   – Os  métodos  diferem  pela  assinatura  (ordem  e   número  de  parâmetros)   – A  escolha  do  método  ocorre  em  tempo  de   compilação   Daniel  Arndt  Alves   Polimorfismo   12  
  13. 13. Tipos  de  Polimorfismo   •  Sobreposição  (overriding):   –  Métodos  na  classe-­‐filha  que  redefinem  ou  sobrepõem   o  comportamento  do  mesmo  método  da  classe-­‐mãe   –  Apresenta  mesma  lista  de  parâmetros!   –  Existe  também  a  sobreposição  (ou  implementação)  de   métodos  concretos  (classe-­‐filha)  em  métodos   abstratos  (classe-­‐mãe  ou  interface)   –  A  escolha  do  método  é  feita  em  tempo  de  execução   Daniel  Arndt  Alves   Polimorfismo   13  
  14. 14. Métodos  Abstrados   •  Métodos  declarados  sem  implementação   – abstract void moveTo(double X, double Y); Daniel  Arndt  Alves   Polimorfismo   14  
  15. 15. Classes  Abstratas   •  São  classes  em  que  um  ou  mais  dos  métodos   são  abstratos:   Daniel  Arndt  Alves   Polimorfismo   15   public abstract class Animal { private String nome; public Animal (String nome){ this.nome = nome; } public String getNome(){ return(nome); } public abstract void emitirSom(); }
  16. 16. Classes  Abstratas   •  Uma  classe  abstrata  declara  atributos  e   comportamentos  comuns  das  várias  classes   em  uma  hierarquia  de  classes.   Daniel  Arndt  Alves   Polimorfismo   16  
  17. 17. Classes  Abstratas   •  As  subclasses  devem  sobrescrever  os  métodos   abstratos  para  se  tornarem  concretas.   •  As  classes  abstratas  não  podem  ser   instanciadas.   Daniel  Arndt  Alves   Polimorfismo   17  
  18. 18. Classes  Abstratas   public class Vaca extends Animal { public Vaca(String nome) { super(nome); } public void emitirSom() { System.out.println("MUUUUUUU"); } }   Daniel  Arndt  Alves   Polimorfismo   18  
  19. 19. Classes  Abstatas   public class Cachorro extends Animal { public Cachorro(String nome) { super(nome); } public void emitirSom() { System.out.println("AUAU"); } public void rosnar() { System.out.println("GRRRRRR"); } }   Daniel  Arndt  Alves   Polimorfismo   19  
  20. 20. Vinculação  Dinâmica   public class AnimalTest { public static void main(String args[]) { Animal ref; Vaca umaVaca = new Vaca("Mimosa"); Cachorro umCachorro = new Cachorro("Rex"); // Referencia cada um como animal ref = umaVaca; ref.emitirSom(); // Polimorfismo: Dynamic Binding ref = umCachorro; ref.emitirSom(); // Polimorfismo: Dynamic Binding } }   Daniel  Arndt  Alves   Polimorfismo   20  
  21. 21. Vinculação  Dinâmica   •  O  compilador  não  sabe  qual  método  deve  ser   chamado.   •  Isto  é  determinado  apenas  durante  a   execução  do  programa.   Animal []meusBichos = new Animal[20]; ... for(int i=0; i<20; i++){ meusBichos[i].emitirSom(); } ... Daniel  Arndt  Alves   Polimorfismo   21  
  22. 22. Vinculação  Dinâmica   List <Animal> meusBichinhos = new LinkedList <Animal>(); ... meusBichinhos.add(umCachorro); meusBichinhos.add(umGato); meusBichinhos.add(umaVaca); ... for(Animal bicho: meusBichinhos) bicho.emitirSom();   Daniel  Arndt  Alves   Polimorfismo   22  
  23. 23. Hierarquia  Empregado   Daniel  Arndt  Alves   Polimorfismo   23  
  24. 24. Classe  Empregado •  Superclasse  abstract Empregado – Método  ganhos  é  declarado  abstract •  Nenhuma  implementacão  pode  ser  dada  à  função   ganhos  na  classe  abstract Empregado Daniel  Arndt  Alves   Polimorfismo   24  
  25. 25. Classe  Empregado public abstract class Empregado { private String primeiroNome; private String ultimoNome; private String rg; public Empregado(String primeiro, String ultimo, String ident) { primeiroNome = primeiro; ultimoNome = ultimo; rg = ident; } } Daniel  Arndt  Alves   Polimorfismo   25  
  26. 26. Classe  Empregado public String getPrimeiroNome() { return primeiroNome; } public String getUltimoNome() { return ultimoNome; } public String getRG() { return rg; }   Daniel  Arndt  Alves   Polimorfismo   26  
  27. 27. Classe  Empregado public void setPrimeiroNome(String primeiro) { primeiroNome = primeiro; } public void setUltimoNome(String ultimo) { ultimoNome = ultimo; } public void setRG(String ident) { rg = ident; } public String toString() { return String.format("%s %snRG: %s", getPrimeiroNome(), getUltimoNome(), getRG()); }   Daniel  Arndt  Alves   Polimorfismo   27  
  28. 28. Classe  Empregado /* * Método abstrato a ser * sobrescrito pelas subclasses */ public abstract double ganhos();   Daniel  Arndt  Alves   Polimorfismo   28  
  29. 29. Classe  EmpregadoHorista public class EmpregadoHorista extends Empregado { private double valorHora; private double horas; public EmpregadoHorista(String primeiro, String ultimo, String ident, double valor, double horas) { super(primeiro, ultimo, ident); setValorHora(valor); setHoras(horas); } }   Daniel  Arndt  Alves   Polimorfismo   29  
  30. 30. Classe  EmpregadoHorista public void setValorHora(double valor){ valorHora = valor; } public void setHoras(double horasTrabalhadas){ horas = horasTrabalhadas; } public double getHoras(){ return horas; } public double getValorHora(){ return valorHora; }   Daniel  Arndt  Alves   Polimorfismo   30  
  31. 31. Classe  EmpregadoHorista // Implementando o método ganhos public double ganhos() { if (getHoras() <= 40) { return getValorHora() * getHoras(); } else { return (getHoras() - 40) * getValorHora() * 1.5; } }   Daniel  Arndt  Alves   Polimorfismo   31  
  32. 32. Classe  EmpregadoAssalariado public class EmpregadoAssalariado extends Empregado { private double salarioSemanal; public EmpregadoAssalariado(String primeiro, String ultimo, String ident, double salario) { super(primeiro, ultimo, ident); setSalarioSemanal(salario); } public double ganhos() { return getSalarioSemanal(); }   Daniel  Arndt  Alves   Polimorfismo   32  
  33. 33. Classe  EmpregadoAssalariado public void setSalarioSemanal(double salario) { salarioSemanal = salario; } public double getSalarioSemanal() { return salarioSemanal; }   Daniel  Arndt  Alves   Polimorfismo   33  
  34. 34. Classe  EmpregadoPorComissao public class EmpregadoPorComissao extends Empregado{ private double vendasBrutas; private double taxaComissao; public EmpregadoPorComissao(String primeiro, String ultimo, String ident, double vendas, double comissao){ super(primeiro, ultimo, ident); setVendasBrutas(vendas); setTaxaComissao(comissao); } public double ganhos(){ return getTaxaComissao() * getVendasBrutas(); } }   Daniel  Arndt  Alves   Polimorfismo   34  
  35. 35. Classe  EmpregadoPorComissao public void setVendasBrutas(double vendas){ vendasBrutas = vendas; } public void setTaxaComissao(double comissao){ taxaComissao = comissao; } public double getTaxaComissao(){ return taxaComissao; } public double getVendasBrutas(){ return vendasBrutas; }   Daniel  Arndt  Alves   Polimorfismo   35  
  36. 36. Classe  EmpregadoFixoMaisComissao public class EmpregadoFixoMaisComissao extends EmpregadoPorComissao { private double salarioBase; public EmpregadoFixoMaisComissao(String primeiro, String ultimo, String ident, double vendas, double comissao, double salario) { super(primeiro, ultimo, ident, vendas, comissao); setSalarioBase(salario); } public double ganhos() { return getSalarioBase() + super.ganhos(); } }   Daniel  Arndt  Alves   Polimorfismo   36  
  37. 37. Classe  EmpregadoFixoMaisComissao public void setSalarioBase(double salario) { salarioBase = salario; } public double getSalarioBase() { return salarioBase; }   Daniel  Arndt  Alves   Polimorfismo   37  
  38. 38. Processamento  Polimórfico   •  Vinculação  Dinâmica   – Também  conhecida  como  Vinculação  Tardia   – Chamadas  aos  métodos  sobrescritos,  são   resolvidas  em  tempo  de  execução,  com  base  no   Hpo  de  objeto  referenciado   Daniel  Arndt  Alves   Polimorfismo   38  
  39. 39. Operador  instanceof •  Determina  se  um  objeto  é  uma  instância  de   um  certo  Hpo.   Daniel  Arndt  Alves   Polimorfismo   39  
  40. 40. A  Classe  Class •  Método  getClass() – Herdado  de  Object – Retorna  um  objeto  do  Hpo  Class Daniel  Arndt  Alves   Polimorfismo   40  
  41. 41. A  Classe  Class •  Método  getName() – Retorna  o  nome  da  classe:   public static void main(String args[]) { Object anObject = new Object(); Class aClass; String aString, anotherString; aClass = anObject.getClass(); aString = aClass.getName(); anotherString = anObject.getClass().getName(); }   Daniel  Arndt  Alves   Polimorfismo   41  
  42. 42. A  Classe  Class import java.util.ArrayList; import java.util.Vector; public class VectorClass { public static void main(String args[]) { Object testObject = new Vector(); if (testObject instanceof Vector) { System.out.println("Instance of the class java.util.Vector"); } else if (testObject instanceof ArrayList) { System.out.println("Instance of the class java.util.ArrayList"); } else { System.out.println("Instance of the classs " + testObject.getClass()); } } }   Daniel  Arndt  Alves   Polimorfismo   42  
  43. 43. Exemplo  de  Polimorfismo   public static void main(String args[]) { Empregado empregados[] = new Empregado[4]; EmpregadoAssalariado empregadoAssalariado = new EmpregadoAssalariado("João", "Silva", "1837-1", 1500); empregados[0] = empregadoAssalariado; EmpregadoHorista empregadoHorista = new EmpregadoHorista("Maria", "Santos", "4857-3", 0, 40); empregados[1]= empregadoHorista; EmpregadoPorComissao empregadoComissionista = new EmpregadoPorComissao("Joana", "Fernandes", "5773-8", 50, 40); empregados[2] = empregadoComissionista; EmpregadoFixoMaisComissao empregadoComissao = new EmpregadoFixoMaisComissao("Roberto", "Antunes", "4857-3", 50, 40, 300); empregados[3] = empregadoComissao;   Daniel  Arndt  Alves   Polimorfismo   43  
  44. 44. Exemplo  de  Polimorfismo   •  Vinculação  Tardia  –  Late  Binding   for(Empregado empregadoAtual:empregados){ // chama a função toString() System.out.println(empregadoAtual); // mostra os ganhos System.out.printf("ganhou $%,.2fnn", empregadoAtual.ganhos()); }   Daniel  Arndt  Alves   Polimorfismo   44  
  45. 45. CasHng   •  Cast:  converter  de  um  Hpo  de  dados  para   outro   int i = 20; double x = 2.5; x = (double) i;   Daniel  Arndt  Alves   Polimorfismo   45  
  46. 46. Conversão  de  Tipos   Tipo   Tamanho   (bits)   Valores   char   16   'u0000'  a  'uFFFF'   byte   8   -­‐128  a  127   int   32   -­‐2.147.483.648  a  -­‐2.147.483.647   short   16   -­‐32.768  a  +32.767   long   64   -­‐9.223.372.036.854.775.808  a   +9.223.372.036.854.775.807   float   32   -­‐3,40292347E+38  a  +3,40292347E+38   double   64   -­‐1,79769313486231570E+308  a   +1,79769313486231570E+308   boolean   8   true  ou  false   Daniel  Arndt  Alves   Polimorfismo   46  
  47. 47. Conversão  de  Tipos   Supondo  a  variável  x   Converter  em   A  variável  y  recebe  o  valor  conver<do   int x = 30   float   float y = (float) x   int x = 30   double   double y = (double) x   float x = 20.5   int   int y = (int) x   String x = "20"   int   int y = Integer.parseInt(x)   String x = "40.84"   float   float y = Float.parseFloat(x)   String x = "40.84"   double   double y = Double.parseDouble(x)   String x = "Java"   Vetor  de  bytes   byte y[] = x.getBytes()   int x = 30   String   String y = String.valueOf(x)   float x = 20.5   String   String y = String.valueOf(x)   double x = 452.43   String   String y = String.valueOf(x)   byte x[]   String   String y = new String(x)   Daniel  Arndt  Alves   Polimorfismo   47  
  48. 48. CasHng   •  Upcast:  converter  sem  perda  de  informação   int i = 20; double x = 2.5; x = (double) i;   Daniel  Arndt  Alves   Polimorfismo   48  
  49. 49. CasHng   •  Downcast:  converer  com  perda  de  informação   int i = 20; double x = 2.5; i = (int) x;   •  Java  warning:  Possible  loss  of  precision   Daniel  Arndt  Alves   Polimorfismo   49  
  50. 50. CasHng   •  Cast:  conversão  dentro  de  uma  hierarquia  de   classes   Daniel  Arndt  Alves   Polimorfismo   50  
  51. 51. CasHng   •  Upcast:  subir  na  hierarquia   – EmpregadoPorComissao -> Empregado – EmpregadoFixoMaisComissao -> EmpregadoPorComissao •  Downcast:  descer  na  hierarquia   – EmpregadoPorComissao -> EmpregadoFixoMaisComissao Daniel  Arndt  Alves   Polimorfismo   51  
  52. 52. CasHng   •  Superclasse <- Superclasse •  Subclasse <- Subclasse Daniel  Arndt  Alves   Polimorfismo   52  
  53. 53. CasHng   •  Superclasse  <-­‐  Subclasse   – Upcast  ocorre  implicitamente   Animal umAnimal = new Animal("Bixo"); Cachorro umCachorro = new Cachorro("Rambo"); umAnimal = umCachorro; umAnimal.rosnar(); – Referenciar  membros  exclusivos  de  subclasses  a   parHr  da  superclasse  gera  um  erro  de  compilação.   Daniel  Arndt  Alves   Polimorfismo   53  
  54. 54. CasHng   •  Subclasse  <-­‐  Superclasse   – Erro  de  compilação   umCachorro  =  umAnimal;   – O  downcasHng  explicito  pode  evitar  este  erro   umCachorro  =  (Cachorro)umAnimal;   – Porém,  gera  uma  ClassCastException  (em   tempo  de  execução)   Daniel  Arndt  Alves   Polimorfismo   54  
  55. 55. CasHng   •  Antes  de  realizar  esta  coerção,  uHlizar  o   operador  instanceof,  para  assegurar  que   o  objeto  é  de  fato  um  objeto  de  um  Hpo  de   subclasse  apropriado.   if(umAnimal instanceof Cachorro) umCachorro = (Cachorro)umAnimal;   Daniel  Arndt  Alves   Polimorfismo   55  
  56. 56. Métodos  final •  Não  podem  ser  sobrescritos  em  uma   subclasse   •  Métodos  private  e  static  são   implicitamente  final •  Métodos  final  são  resolvidos  em  tempo  de   compilação,  isto  é  conhecido  como  vinculação   estáHca.   Daniel  Arndt  Alves   Polimorfismo   56  
  57. 57. Classes  final •  Não  podem  ser  estendidas  por  uma  subclasse   •  Todos  os  métodos  em  uma  classe  final  são   implicitamente  final Daniel  Arndt  Alves   Polimorfismo   57  
  58. 58. Polimorfismo   58  Daniel  Arndt  Alves  
  59. 59. Polimorfismo   59  Daniel  Arndt  Alves  
  60. 60. Imagens   •  htp://www.goldb.org/goldblog/cmg_images/ real_programmers_binary.jpg     •  htp://sandersconsulHng.com/Portals/58319/ images/checklist.jpg     Daniel  Arndt  Alves   Polimorfismo   60  
  61. 61. Obrigado     Daniel  Arndt  Alves     htp://www.progdan.pro.br/     daniel.alves@mackenzie.br   progdan@progdan.pro.br     Polimorfismo   61  Daniel  Arndt  Alves  

×