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)


Responder a