quinta-feira, 2 de outubro de 2008

Por que alguns desenvolvedores Java não sabem o que é passagem por referência?

Por que é muito comum observar discussões se Java é passagem por valor ou se é passagem por referência? Será que toda essa dúvida é justificável? Existe na arquitetura da linguagem Java alguma característica que ajude a provocar essa dúvida? Vou tentar explicar esse assunto novamente.

Para entender corretamente esse assunto é necessário o conhecimento de alguns fundamentos:

Valor de uma variável: toda variável representa um espaço de memória onde é possível armazenar alguma informação e esse é o valor da variável. A forma mais comum de atribuir valor a uma variável em Java é através do operador de atribuição =.

Exemplo:

int x = 35; // o valor 35 foi atribuído a variável x
char y = 'u'; // o valor 'u' foi atribuído a variável y

Referência de uma variável: referência é um endereço de memória, logo, referência de uma variável é o endereço de memória onde a variável está alocada.

Em Java não existe um comando para pegar a referência de uma variável. Em C existe o operador & que tem essa função.

Exemplo 01:

int main(int argc, char *argv[]) {
int a = 25;
printf("Valor de a: %d e da referência de a: %d\n", a, &a);
return 0;
}

Ok, em Java não existe uma forma de obter o endereço de memória de uma variável, ou seja, não existe como pegar uma referência de uma variável. Então de onde vem a dúvida? O grande vilão dessa história é o comando new.

O comando new: serve para criar instâncias de classes, os famosos objetos. O que gera dúvida é a seguinte sintaxe do comando new:

ObjetoQualquer x = new ObjetoQualquer();

Observando a linha acima o desenvolvedor pode acreditar que a variável x armazena uma instância da classe ObjetoQualquer, na verdade, na linha acima, o comando new cria uma instancia da classe ObjetoQualquer e armazena o endereço de memória, dessa instância na variável x.

Ainda com dúvidas? Lembre-se do modificador final: esse modificador tem a função de não permitir que o valor (lembre-se eu disse VALOR) de uma variável seja modificado. Observe o exemplo:

Exemplo 02:

public class TesteFinal {
public static void main(String args[]) {
final int x = 55;
x = 40;
}
}

Nesse exemplo vamos observar um erro, pois tentamos alterar o valor da variável x de 55 para 40. Vamos a outro exemplo.

Exemplo 03:

classe ArmazenaInteiro {
int x = 55;
}

public class TesteFinal {
public static void main(String args[]) {
final ArmazenaInteiro a = new ArmazenaInteiro();
a.x = 40;
a.x = 990;
a.x = 312;
}
}

Pode testar... Não será encontrado nenhum erro, nos alteramos o objeto que está armazenado em a, mas não alteramos o valor de a.

Para finalizar a contraprova do exemplo 03, vamos agora alterar o valor de a:

Exemplo 04:

classe ArmazenaInteiro {
int x = 55;
}

public class TesteFinal {
public static void main(String args[]) {
final ArmazenaInteiro a = new ArmazenaInteiro();
a = new ArmazenaInteiro();
}
}

Erro na certa.

Não tenho a pretensão de achar que esse post vai eliminar com as gigantescas dúvidas sobre passagem por valor X passagem por referência em Java, mas, tentei fazer a minha parte, usei uma abordagem diferente.

0 comentários:

Seguidores

Total de visualizações

Tecnologia do Blogger.
Evandro Santos © 2016 Suporte Blogger Templates