Lembre-se que o valor de uma expressão de tipo não primitivo é uma referência a um objeto. Então, quando atribuímos uma expressão de tipo não primitivo a uma variável, o valor da variável passa a ser uma referência.
É possível ter várias variáveis a referenciarem o mesmo objeto. Por exemplo, as instruções seguintes
StringBuilder sb1 = new StringBuilder("Olah!");
StringBuilder sb2 = sb1;
geram um estado da memória que se pode representar assim:
As variáveis sb1
e sb2
contém o mesmo valor: uma referência para o mesmo objeto. Por outras palavras,
podemos referir-nos a este objeto de duas formas: através de
sb1
e desb2
.
- Chama-se a isto aliasing.
Quando duas variáveis referenciam o mesmo objeto, quaisquer mudanças no objeto que uma delas refere, afetam também o objeto (o mesmo!) que a outra refere, pois na verdade existe um só objeto, que é partilhado pelas duas variáveis. Por exemplo:
xxxxxxxxxx
System.out.println(sb2.toString());
sb1.append(" Adeus.");
System.out.println(sb2.toString());
A primeira instrução escreve Olah! no ecrã, que é o valor correspondente ao texto guardado em sb2
.
A segunda instrução invoca o método append
sobre sb1
, que acrescenta " Adeus." ao StringBuilder
.
A terceira linha imprime Olah! Adeus. no ecrã. Todas as alterações que são feitas sobre o objeto através de sb1
afetam o objeto referenciado por sb2
(o mesmo objeto) e vice-versa.
Embora muito útil, como veremos adiante, é preciso ter cuidado com a utilização de aliasing pois rapidamente pode levar a erros e confusões.
Anterior: 8.5. Input e Output em Java
Seguinte: 8.7. null