2012-05-25 13 views
6

Duplicar posible:
Is Java pass-by-reference?¿Cómo cambia Arrays.sort() la variable que se le pasa?

estoy un poco confundido aquí. ¿Cómo modifica Arrays.sort (a) el valor de a?

int[] a = {9,8,7,6,5,4,3,2,1}; 
Arrays.sort(a); 
System.out.println(Arrays.toString(a)); 

pensé que era java paso por valor ...

+0

Además, el jdk viene con las fuentes, por lo que puede echarle un vistazo si desea obtener más información al respecto. – Puce

+0

Solo para ampliar las respuestas: esto solo funciona porque sort no cambia el tamaño de la matriz. Si quisiera hacer eso, tendría que asignar una nueva matriz y no podría simplemente modificar la matriz existente. – biziclop

Respuesta

10

Sí, Java es pasar por valor. Sin embargo, lo que se pasa por valor aquí es referencia a la matriz, no la matriz en sí.

+1

Si quiere cambiar la matriz en otro método sin cambiar el original, debe hacer una copia. ¿correcto? – Josh

+1

@Josh: Correcto. Puede usar 'a.clone()' para hacer una copia. – NPE

+0

@Josh sí, tienes razón –

6

Los objetos en Java se pasan por valor de referencia. Por lo tanto, si pasa un objeto, obtiene una copia de la referencia (si asigna esa referencia a otra cosa, solo se modifica el parámetro, el objeto original aún existe y el programa principal lo menciona).

This link demonstrates a bit about passing by value of reference.

public void badSwap(Integer var1, Integer var2) 
{ 
    Integer temp = var1; 
    var1 = var2; 
    var2 = temp; 
} 

Esos son referencias a objetos, pero no se cambiará, ya que son sólo las referencias internas en el ámbito de la función. Sin embargo, si usted hace esto:

var1.doubleValue();

Se utilizará la referencia al objeto original.

+0

+1 Es importante recordar: solo la referencia es "clonada", no el objeto al que se hace referencia. Damos por hecho esto en la mayoría de los casos, pero por alguna razón causa confusión con las matrices. – biziclop

+0

Los objetos en Java no se pasan por referencia nunca. Cuando pasas un objeto a una función, pasas la referencia del objeto (su valor), p. en C++ pasas la referencia y puedes hacer aritmética de puntero, en Java no puedes hacerlo. –

+0

@LuiggiMendoza Me gusta pensar más en una "pseudo referencia". Puede usarlo para acceder al objeto y sus campos, pero no es comparable a un puntero de estilo C. –

2

Es cierto que Java siempre pasa de a-valor y para los objetos, la referencia del objeto pasó por valor. Por lo tanto, la referencia de su matriz se pasa por valor.

5

Arrays.sort no modifica la variable, modifica el objeto de matriz al que apunta la variable.

1
  1. Lo ordena.
  2. La referencia a la matriz se pasa por valor. No la matriz en sí.
0

La referencia a la matriz se pasa por valor, por lo que el método sort tiene su propia referencia que todavía se refiere a la misma matriz como a referencias. Esto significa que sort puede cambiar el contenido de la misma matriz que hace referencia a a.

Cuestiones relacionadas