Polimorfismo
Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação, assinatura, mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. O overload não é um tipo de polimorfismo, pois com overload a assinatura do método obrigatoriamente tem que ter argumentos diferentes, requisito que fere o conceito de Polimorfismo citado acima.
De forma genérica, polimorfismo significa várias formas. No caso da Orientação a Objetos, polimorfismo denota uma situação na qual um objeto pode se comportar de maneiras diferentes ao receber uma mensagem, dependendo do seu tipo de criação.
Por exemplo, a operação move quando aplicada a uma janela de um sistema de interfaces tem um comportamento distinto do que quando aplicada a uma peça de um jogo de xadrez. Um método é uma implementação específica de uma operação para certa classe. Polimorfismo também implica que uma operação de uma mesma classe pode ser implementada por mais de um método. O usuário não precisa saber quantas implementações existem para uma operação, ou explicitar qual método deve ser utilizado: a linguagem de programação deve ser capaz de selecionar o método correto a partir do nome da operação, classe do objeto e argumentos para a operação. Desta forma, novas classes podem ser adicionadas sem necessidade de modificação de código já existente, pois cada classe apenas define os seus métodos e atributos. Em Java, o polimorfismo se manifesta apenas em chamadas de métodos.
A decisão sobre qual o método que deve ser selecionado, de acordo com o tipo da classe derivada, é tomada em tempo de execução, através do mecanismo de ligação tardia. A ligação tardia ocorre quando o método a ser invocado é definido durante a execução do programa. Através do mecanismo de sobrecarga, dois métodos de uma classe podem ter o mesmo nome, desde que suas assinaturas sejam diferentes, entretanto isso não é polimorfismo. Como dito anteriormente, tal situação não gera conflito, pois o compilador é capaz de detectar qual método deve ser escolhido a partir da análise dos tipos dos argumentos do método. Nesse caso, diz-se que ocorre a ligação prematura para o método correto. Em Java, todas as determinações de métodos a executar ocorrem através de ligação tardia exceto em dois casos:
1.
Métodos
declarados como final não podem ser
redefinidos e, portanto não são passíveis de invocação polimórfica da parte de
seus descendentes; e
2.
Métodos
declarados como private são implicitamente
finais.
No
caso de polimorfismo, é necessário que os métodos tenham exatamente a mesma
identificação, sendo utilizado o mecanismo de redefinição de métodos, que é o
mesmo que sobrescrita de métodos em classes derivadas. A redefinição ocorre quando um método cuja
assinatura já tenha sido especificada recebe uma nova definição, ou seja, um
novo corpo, em uma classe derivada. É importante observar que, quando
polimorfismo está sendo utilizado, o comportamento que será adotado por um
método só será definido durante a execução. Embora em geral esse seja um
mecanismo que facilite o desenvolvimento e a compreensão do código orientado a
objetos, há algumas situações onde o resultado da execução pode ser
não-intuitivo.
Exemplo:
abstract
class Mamífero {
public abstract double
obterCotaDiariaDeLeite();
}
class
Elefante extends Mamífero {
public double obterCotaDiariaDeLeite(){
return 20.0;
}
}
class
Rato extends Mamifero {
public double obterCotaDiariaDeLeite() {
return 0.5;
}
}
class
Aplicativo {
public static void main(String args[]){
System.out.println("Polimorfismo\n");
Mamifero mamifero1 = new Elefante();
System.out.println("Cota diaria de
leite do elefante: " + mamifero1.obterCotaDiariaDeLeite());
Mamifero mamifero2 = new Rato();
System.out.println("Cota diaria de
leite do rato: " + mamifero2.obterCotaDiariaDeLeite());
}
}
Nenhum comentário:
Postar um comentário
O que achou dessa postagem?