referência objecto java / questão escopo
Pergunta
Se eu tiver uma variável de membro como este (declarada no corpo de uma classe)
private Dot[] dots=new Dot[numDots];
Eu percorrer todos os membros desta matriz, e:
1) Passe cada objeto Dot para uma função de outra classe, que:
2) passa para outra função de uma 3ª classe, se forem cumpridas algumas condições
3) E a 3ª classe muda algumas propriedades do objeto Dot
então quando esse objeto é retornado para a classe original / pai, que essas alterações para suas propriedades têm mantido? Ou seria tratado como uma variável local pelos 2º 3º funções /?
Solução
Sim, as alterações para as propriedades são mantidas. Java é 100% passe por valor, no entanto, quando você passar um objeto, o "valor" passado é realmente um ponteiro para o objeto. Assim, quando você alterar um objeto em um método, você está mudando o objeto real passado.
Isto é, se você tem o seguinte método, em seguida, o método chamando vai ver as alterações:
private void updateMyDot(final Dot aDot) {
aDot.dotColor = new Color(255,255,255);
}
mas se você fazer o seguinte, em seguida, o método chamado não ver as alterações.
private void updateMyDot(/* not final */ Dot aDot) {
aDot = new Dot();
aDot.dotColor = new Color(255,255,255);
}
No segundo exemplo, o chamador não ver todas as mudanças e não ver o objeto Dot
recém-criado.
Outras dicas
Os objetos são passados ??por [ referência valor onde o valor é a referência ] (coisas que herdam de Object), os valores primitivos (int, long, double, etc. ) são passados ??por valor.
Isto significa que quando um primitivo é passada a partir de um chamador com o método que é copiado, enquanto que com um objeto um [ valor do ] referência é passado.
Que em meio turno que quando um objeto é transformado por um método o chamador vê essas mudanças porque tem uma referência para o mesmo objeto.
Por outro lado quando um método transforma um primitivo o chamador não vê as mudanças como o método está trabalhando em uma cópia.
[razão para a edições]
Se o Java teve passagem por referência, então você poderia fazer isso:
Object x;
x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float
onde foo é definido como:
void foo(Object o)
{
o = new Float(43);
}
Desde Java passa a referência de valor o = new Float(43);
é permitido - mas o valor no chamador permanecerá como o new Integer(42);