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 /?

Foi útil?

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);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top