Polimorfismo em Java

Considere uma classe Veículo com duas classes derivadas, Automóvel e Bicicleta:

Essas classes têm três métodos, definidos para veículos de forma geral e redefinidos mais especificamente para automóveis e bicicletas:

  1. checkList(), para verificar o que precisa ser analisado no veículo;
  2. adjust(), para realizar os reparos e a manutenção necessária; e
  3. cleanup(), para realizar procedimentos de limpeza do veículo.

A aplicação Oficina define um objeto que recebe objetos da classe Veículo. Para cada veículo recebido, a oficina executa na seqüência os três métodos da classe Veículo. No entanto, não há como saber no momento da programação se a Oficina estará recebendo um automóvel ou uma bicicleta -- assim, o momento de decisão sobre qual método será aplicado só ocorrerá durante a execução do programa.

Este trecho de código ilustra a utilização da classe Oficina, considerando que os métodos acima foram definidos para Veículo e para todas as suas classes derivadas. Um possível resultado da interpretação dessa aplicação é:

Veiculo Bicicleta
Bicicleta.checkList
Bicicleta.adjust
Bicicleta.cleanup
Veiculo Bicicleta
Bicicleta.checkList
Bicicleta.adjust
Bicicleta.cleanup
Veiculo Automovel
Automovel.checkList
Automovel.adjust
Automovel.cleanup
Veiculo Automovel
Automovel.checkList
Automovel.adjust
Automovel.cleanup

Alguns pontos a destacar com relação a esse exemplo:

Upcasting
O método Oficina.proximo() realiza uma atribuição de um objeto Automóvel à variável (referência para objeto Veiculo) v quando o valor do número aleatório gerado é par (o resto da divisão inteira por 2 é igual a 0). Essa atribuição de um objeto de uma classe mais especializada para uma referência de uma classe ancestral é denominada upcast. Esse mesmo tipo de atribuição é realizado de Bicicleta para veículo quando o número aleatório gerado é ímpar.
Uso de métodos abstratos
Apesar de métodos da classe Veículo terem sido definidos, estes nunca são invocados nesse exemplo. (Se fossem, algo estaria errado.) Isso ilustra uma situação onde métodos abstratos poderiam ser utilizados, pois a definição do corpo desses métodos é de fato irrelevante. Ainda mais, se uma classe como essa só contém métodos abstratos, ela poderia ser implementada como uma interface Java.

© Ivan Luiz Marques Ricarte
DCA/FEEC/UNICAMP

Last modified: Wed Jun 28 18:31:52 EST 2000