A dica de hoje foi enviada pelo Walter Augusto Werner
([EMAIL PROTECTED])
==========================================================================
Olah,
Estava fazendo alguns testes com Java estes dias e descobri uma coisa
que naum sabia sobre overloading. Talvez este problema jah seja bem
conhecido, mas acredito que muitas pessoas ainda naum o conhecem, entaum
estou mandando isto como uma sugestaum de dica.
Bom vou tentar explicar, o problema eh que Java perde o polimorfismo
quando se usa overloading. Vou explicar com um exemplo que creo ser mais
facil:
Tendo a seguinte configuracaum:
A <-- B
A classe "A" tem um metodo "x(Object o)" e a subclass "B" sobrecarrega o
metodo, tem um metodo "x(Integer i)".
Entaum no meu metodo na class "C"(logicamente este codigo poderia estar
em qualquer uma das classes anteriores) eu tenho o seguinte codigo:
Object o = new Integer(1);
B b = new B();
b.x(o);
Integer i = new Integer(1);
A a = new B();
a.x(i);
Em ambos os casos o metodo chamado serah o definido na classe "A" ao
invez do metodo sobrecarregado em "B".
A explicacaum para isto estah em como funciona o metodo lookup e o
calculo do endereco do metodo na tabela de metodos usada em tempo de
execucaum.
Este endereco na tabela de metodos eh calculado em tempo de compilacaum,
que calcula o endereco do metodo a ser chamado de acordo com o tipo da
referencia.
Overriding funciona, pois o endereco dos metodos de toda a hierarquia de
classes eh o mesmo na tabela de metodos, entaum como o metodo lookup eh
feito em runtime sempre pega o metodo correto, pois quando sobre escrito
muda o endereco de memoria onde estah codigo do metodo na tabela de
metodos, mas o endereco (ou indice para naum confundir com o endereco de
memoria) nesta tabela continua o mesmo. O problema com o overloading eh
que ele cria uma nova entrada na tabela de metodos. Entaum em tempo de
compilacaum soh sabe o tipo da referencia que serah usada e naum o tipo
do objeto em runtime. Assim naum consegue definir que o metodo que
deveria usar eh o sobrecarregado ao invez do metodo na super classe.
Com o uso de interfaces isto eh um pouco diferente, mas este problema
acontece tb.
Espero que tenha conseguido explicar o problema, e que isto seja util
para o pessoal.
Abracos,
Walter Augusto Werner
______________________________________________________________________________
Handerson Ferreira Gomes
Summa Technologies
Boletim Dicas Java - Sua dose diária de Java
================================================================================
[dicas-list] circula diariamente com pequenas dicas sobre a plataforma Java e é
mais um serviço da Sociedade de Usuários Java - http://www.soujava.org.br
*** SouJava - Fortalecendo a Comunidade Java Brasileira! ***
- Para contribuir com uma dica, envie um e-mail para [EMAIL PROTECTED]
- Participe de outras listas de discussão sobre a linguagem Java.
Saiba mais em http://www.soujava.org.br/lista.htm
--------------------------------------------------------------------------------
- Para assinar este boletim: mailto:[EMAIL PROTECTED]
- Para cancelar sua assinatura: mailto:[EMAIL PROTECTED]
- Dicas anteriores: http://www.mail-archive.com/dicas-list%40soujava.org.br
- Para discutir sobre as dicas, acesse o Mundo OO (http://www.mundooo.com.br)