Quando se pensa na dinâmica que o computador faz para armazenar as informações
referente a variáveis e objetos que utilizamos em nosso código, por padrão temos noção de
que essas informações ficam armazenadas na memória do computador enquanto estamos
com nossa variável em uso dentro do nosso código. E ao encerrar o código, tudo se encerra
por ali.
De fato, o conceito está correto. Mas por trás existe um comportamento que é
importante termos cuidado quando estamos desenvolvendo nosso código: a diferença entre variáveis por referência e por valor.
Por padrão, quando definimos uma variável como abaixo:
String a = "Isto é uma String!";
Estamos atribuindo um valor específico a ela, neste caso criamos uma String com o
valor de “Isto é uma String!”. Assim como podemos criar um inteiro, um double, etc. Estes são exemplos de variáveis definidas por valor, o que implica no fato de que na memória do
computador, ao ser definida uma variável deste tipo, é alocado um espaço específico contendo o valor definido.
Se eu criar uma variável A = 10 e uma variável B = A, cada uma delas, dentro da
memória do meu computador, ocupará um espaço diferente.
Esse comportamento é bastante interessante quando precisamos tratar cada variável
como um valor independente de fato. Apesar disso, como você pode imaginar, se eu definir
1000 variáveis diferentes como = A (C = A, D = A, E = A, etc.), cada uma delas estará ocupando um espaço a mais na minha memória, espaços estes que contém o mesmo valor (neste caso 10).
Agora, veja o caso abaixo, temos uma situação um pouco diferente:
public class Teste {
public static void main(String[] args) {
Sapato a = new Sapato();
Sapato b = a;
}
}
class Sapato {
String cor = "Branco";
int tamanho = 38;
}
Neste caso, criamos uma classe apenas com o intuito de analisar como se comporta o
armazenamento de um objeto dessa classe dentro da memória. Criamos o objeto A, e
semelhante ao que fizemos anteriormente, criamos um objeto B = A.
Apesar de a operação aqui ser muito parecida, se analisarmos os endereços de
memória de A e B, agora eles apontarão para o mesmo lugar. Isso acontece, pois, apenas um objeto foi criado na memória (A), e quando o objeto B foi criado, o que o Java faz por traz é uma referência ao objeto A.
Ao contrário do que vemos no caso das variáveis por valor, neste caso das variáveis
por referência se criarmos 1000 variáveis definindo que são iguais a A (C = A, D = A, E = A, etc.), neste caso não teremos o problema de estar ocupando uma memória diferente para cada uma delas, pois todas as variáveis, por trás, estão fazendo referência ao endereço de memória de A.
O revés que temos aqui é: caso eu decida que agora A.cor = “Amarelo”, essa mudança
afetará todas as variáveis que definimos, visto que a alteração ocorrerá no endereço de memória que todas elas fazem referência.
Comments