Pregunta

Si tengo una variable miembro como esta (declarada en el cuerpo de una clase)

private Dot[] dots=new Dot[numDots];

Recorro todos los miembros de esta matriz y:

1) Pase cada objeto Dot a una función de otra clase, que:

2) Pasa a otra función de una tercera clase, si se cumplen algunas condiciones

3) Y la tercera clase cambia algunas propiedades del objeto Dot

luego, cuando este objeto se devuelva a la clase original / principal, ¿se habrían retenido esos cambios en sus propiedades? ¿O sería tratada como una variable local por las funciones 2ª / 3ª?

¿Fue útil?

Solución

Sí, los cambios en las propiedades se mantienen. Java es 100% de paso por valor, sin embargo, cuando pasa un objeto, el " valor " Pasado es realmente un puntero al objeto. Por lo tanto, cuando cambia un objeto en un método, está cambiando el objeto real pasado.

Es decir, si tiene el siguiente método, entonces el método de llamada verá los cambios:

private void updateMyDot(final Dot aDot) {
  aDot.dotColor = new Color(255,255,255);
}

pero si haces lo siguiente, entonces el método de llamada no verá los cambios.

private void updateMyDot(/* not final */ Dot aDot) {
  aDot = new Dot();
  aDot.dotColor = new Color(255,255,255);
}

En el segundo ejemplo, la persona que llama no verá ningún cambio y no verá el objeto Dot creado recientemente.

Otros consejos

Los objetos se pasan por [ reference value donde el valor es la referencia ] (cosas que heredan de Object), valores primitivos (int, long, double, etc.) ) se pasan por valor.

Esto significa que cuando se pasa una primitiva de un llamador al método, se copia, mientras que con un objeto se pasa una [ valor de la ] referencia.

Lo que a su vez significa que cuando un objeto es mutado por un método, la persona que llama ve esos cambios porque tiene una referencia al mismo objeto.

A la inversa, cuando un método muta una primitiva, la persona que llama no ve los cambios mientras el método está trabajando en una copia.

[motivo de las ediciones]

Si Java hubiera pasado por referencia, entonces podría hacer esto:

Object x;

x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float

donde foo se define como:

void foo(Object o)
{
   o = new Float(43);
}

Ya que Java pasa la referencia por el valor o = new Float (43); está permitido, pero el valor en la persona que llama permanecerá como el new Integer (42);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top