• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Polimorfismo
 

Polimorfismo

on

  • 627 views

Conceitos básicos sobre Polimorfismo em Linguagem Java

Conceitos básicos sobre Polimorfismo em Linguagem Java

Statistics

Views

Total Views
627
Views on SlideShare
627
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Polimorfismo Polimorfismo Presentation Transcript

    • 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  
    • 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  
    • 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  
    • Tópicos  da  Aula   •  Exemplo  de  Polimorfismo   •  CasHng   – Cast   – Upcast   – Downcast   •  Métodos  Final •  Classes  Final Polimorfismo   4  Daniel  Arndt  Alves  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • Métodos  Abstrados   •  Métodos  declarados  sem  implementação   – abstract void moveTo(double X, double Y); Daniel  Arndt  Alves   Polimorfismo   14  
    • 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(); }
    • Classes  Abstratas   •  Uma  classe  abstrata  declara  atributos  e   comportamentos  comuns  das  várias  classes   em  uma  hierarquia  de  classes.   Daniel  Arndt  Alves   Polimorfismo   16  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • Hierarquia  Empregado   Daniel  Arndt  Alves   Polimorfismo   23  
    • 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  
    • 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  
    • Classe  Empregado public String getPrimeiroNome() { return primeiroNome; } public String getUltimoNome() { return ultimoNome; } public String getRG() { return rg; }   Daniel  Arndt  Alves   Polimorfismo   26  
    • 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  
    • Classe  Empregado /* * Método abstrato a ser * sobrescrito pelas subclasses */ public abstract double ganhos();   Daniel  Arndt  Alves   Polimorfismo   28  
    • 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  
    • 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  
    • 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  
    • 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  
    • Classe  EmpregadoAssalariado public void setSalarioSemanal(double salario) { salarioSemanal = salario; } public double getSalarioSemanal() { return salarioSemanal; }   Daniel  Arndt  Alves   Polimorfismo   33  
    • 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  
    • 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  
    • 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  
    • Classe  EmpregadoFixoMaisComissao public void setSalarioBase(double salario) { salarioBase = salario; } public double getSalarioBase() { return salarioBase; }   Daniel  Arndt  Alves   Polimorfismo   37  
    • 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  
    • Operador  instanceof •  Determina  se  um  objeto  é  uma  instância  de   um  certo  Hpo.   Daniel  Arndt  Alves   Polimorfismo   39  
    • A  Classe  Class •  Método  getClass() – Herdado  de  Object – Retorna  um  objeto  do  Hpo  Class Daniel  Arndt  Alves   Polimorfismo   40  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • CasHng   •  Upcast:  converter  sem  perda  de  informação   int i = 20; double x = 2.5; x = (double) i;   Daniel  Arndt  Alves   Polimorfismo   48  
    • 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  
    • CasHng   •  Cast:  conversão  dentro  de  uma  hierarquia  de   classes   Daniel  Arndt  Alves   Polimorfismo   50  
    • CasHng   •  Upcast:  subir  na  hierarquia   – EmpregadoPorComissao -> Empregado – EmpregadoFixoMaisComissao -> EmpregadoPorComissao •  Downcast:  descer  na  hierarquia   – EmpregadoPorComissao -> EmpregadoFixoMaisComissao Daniel  Arndt  Alves   Polimorfismo   51  
    • CasHng   •  Superclasse <- Superclasse •  Subclasse <- Subclasse Daniel  Arndt  Alves   Polimorfismo   52  
    • 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  
    • 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  
    • 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  
    • 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  
    • 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  
    • Polimorfismo   58  Daniel  Arndt  Alves  
    • Polimorfismo   59  Daniel  Arndt  Alves  
    • 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  
    • Obrigado     Daniel  Arndt  Alves     htp://www.progdan.pro.br/     daniel.alves@mackenzie.br   progdan@progdan.pro.br     Polimorfismo   61  Daniel  Arndt  Alves