2009-03-08 4 views
8

Si tengo una variable miembro como este (declarado en el cuerpo de una clase)Java referencia de objeto/pregunta alcance

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

bucle I a través de todos los miembros de esta matriz, y:

1) Pase todos los objetos de punto a una función de otra clase, que:

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

3) Y la tercera clase cambia algunos prope rties del objeto Dot

luego, cuando este objeto se devuelve a la clase original/principal, ¿se conservarán esos cambios en sus propiedades? ¿O sería tratado como una variable local por la 2ª/3ª función?

+0

Me gusta su nombre y voté sin leer la pregunta. – Cheeso

Respuesta

12

Sí, se conservan los cambios en las propiedades. Java es 100% pass-by-value, sin embargo, cuando pasa un objeto, el "valor" pasado es realmente un puntero al objeto. Por lo tanto, cuando se cambia un objeto en un método, que está cambiando el objeto real que se pasa en

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 hace lo siguiente, entonces el método de llamada será no vea 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 los cambios y no ver el Dot objeto recién creado.

2

objetos se pasan por [ referenciavalor donde el valor es la referencia] (cosas que heredan de objeto), valores primitivos (int, largo, doble, etc.) se pasan por valor.

Esto significa que cuando se pasa una primitiva desde un llamante al método se copia, mientras que con un objeto se pasa una referencia [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.

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

[razón de las ediciones]

Si Java había paso por referencia entonces se 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); 
} 

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

+0

Como se indica en un millón de otros lugares, esto no es estrictamente cierto. Todos los parámetros se pasan por valor en Java. Sin embargo, las variables de objeto en realidad se refieren a referencias de objetos. Pasar un objeto como un parámetro de método copia la variable de objeto, es decir, copia la referencia. – mtruesdell