Polimorfismo


Qualquer objeto Java que pode passar por mais de um teste IS-A pode ser considerado um caso de polimorfismo. À exceção de objetos do tipo Object, todos os objetos Java são polimórficos, pois eles passam por um teste IS-A com seu próprio tipo e por um com a classe Object.
A única maneira de acessar um objeto é através de uma variável de referência:
·         Uma variável de referência (objeto) só pode ser de um tipo, e uma vez declarada, aquele tipo jamais poderá ser mudado, embora o objeto possa mudar a referência;
·         Uma referência é uma variável, então ela pode ser transferida para outros objetos, a não ser que a referência esteja declarada como final;
·         Um tipo de variável de referência determina os métodos que podem ser invocados no objeto que a variável está referenciada;
·         Uma variável de referência pode se referir a qualquer objeto do mesmo tipo que a referência declarada, ou a qualquer subtipo do tipo declarado;
·         Uma variável de referência pode ser declarada como um tipo de classe ou um tipo de interface. Se a variável é declarada como um tipo interface, ela pode fazer referência a qualquer objeto de qualquer classe que implementa a interface.
Polimorfismo significa que uma chamada de método pode ser executada de várias formas (ou polimorficamente). Quem decide "a forma" é o objeto que recebe a chamada. Invocações de métodos polimórficos são aplicadas somente para métodos de instância.
Se um objeto a chama um método grita() de um objeto b, então o objeto b decide a forma de implementação do método. Então a chamada b.grita() vai ser um grito humano se b for um humano e será um grito de macaco, se o objeto b for um macaco. A forma como b vai escolher qual método vai executar vai depender de onde (qual classe) veio essa referência de b, ou seja, se b está instanciado como Humano ou Macaco.
Existem quatro formas de receber essa referência:
·         O objeto AppGritar  cria o objeto b:

public class Gritador {
      public void grita() {
            System.out.println("Gritando..");
      }    
}

public class Humano extends Gritador {
      public void grita() {
            System.out.println("Humano gritando");
      }    
}

public class Macaco extends Gritador {
      public void grita() {
            System.out.println("Macaco gritando");
      }    
}

public class AppGritar {
      public static void main(String[] args) {
          Gritador g;
          g = new Humano();
          // chamada polimórfica
          g.grita(); // imprime: Humando gritando
          g = new Macaco();
          // chamada polimórfica
          g.grita(); // imprime: Macaco gritando
      }
}

·         O objeto AppGritar  recebe o objeto g de um objeto r:

public class Retorna {
      public Humano retornaHumano() {
            return new Humano();
      }    
      public Macaco retornaMacaco() {
            return new Macaco();
      }    
}

public class AppGritar {
      public static void main(String[] args) {
          Retorna r = new Retorna();
          Gritador g = r.retornaHumano();
          // chamada polimórfica
          g.grita();  // imprime: Humando gritando
          g = r.retornaMacaco();
          // chamada polimórfica
          g.grita(); // imprime: Macaco gritando
      }
}

·         O objeto AppGritar recebe o objeto g numa chamada de método:

public class AppGritar {
      public static void main(String[] args) {
            Humano humano = new Humano();
            chamaGritar(humano); // Humando gritando
            Macaco macaco = new Macaco();
            chamaGritar(macaco); // Macaco gritando
      }
      static void chamaGritar(Gritador gritador) {
            /* dependendo da instância que vier como
             * parâmetro, chama Humano ou Macaco */
            gritador.grita(); // chamada polimórfica
      }
}

·         Através de uso de interfaces (sem herança):

public interface Gritador2 {
      void grita();
}

public class Humano2 implements Gritador2 {
      public void grita() {
          System.out.println("AAAAAAHHHHH");
        }
}

public class Macaco2 implements Gritador2 {
      public void grita() {
          System.out.println("IIIHHHIIIIHHH");
        }
}

public class AppGritar2 {
      public static void main(String[] args) {
          Gritador2 g;
          g = new Humano2();
          // chamada polimórfica
          g.grita(); // imprime: Humando gritando
          g = new Macaco2();
          // chamada polimórfica
          g.grita(); // imprime: Macaco gritando
      }    
}


Fonte: SCJP Sun Certifi ed Programmer for Java 6 Study Guide

0 comentários:

Postar um comentário