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: