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