2010-05-14 11 views
22

chicos pensé que casi todo el lenguaje, incluido el arreglo de java pass en la función de referencia (modificable)java array pass by reference no funciona?

pero de alguna manera no funciona aquí. y el testArray sigue siendo 1,2,3 con tamaño de 3

lo suficientemente extraño, cuando si cambio el resultado [i] = 2 a a [1] = 2; funciona . pasó por referencia

¿Qué hay de malo con este código?

al final, tuve un = resultado; (que actualiza el a). el resultado fue eliminado de la pila. es por eso que todavía llegar al a original?

estoy confundido.

gracias

class Test 
{ 
    public static void main(String[] args) 
    { 

     int[] testArray = {1,2,3}; 
     equalize(testArray, 6); 

     System.out.println("test Array size :" + testArray.length); 
     for(int i = 0; i < testArray.length; i++) 
     System.out.println(testArray[i]); 
    } 

    public static void equalize(int[] a, int biggerSize) 
    { 
     if(a.length > biggerSize) 
     throw new Error("Array size bigger than biggerSize"); 

     int[] result = new int[biggerSize]; 
    // System.arraycopy(a, 0, result, 0, a.length); 
    // int array default value should be 0 
     for(int i = 0; i < biggerSize; i++) 
     result[i] = 2; 

     a = result; 
    } 
} 
+0

Por favor explique su lógica en los detalles. ¿Estás tratando de expandir tu tamaño de matriz? Actualmente, su matriz de resultados no copia ningún valor de la matriz original. – Sujee

+0

¿Has visto ? – hejiaming007

Respuesta

6

Java es pasar por valor. Es por eso que tu código no funciona. Una buena práctica sería marcar int[] a como final, por lo que se produciría un error de compilación (consulte el correspondiente Checkstyle rule).

49

La matriz se pasa por referencia, pero la referencia se pasa por valor. Es decir, puede cambiar la matriz a la que se refiere a, pero no puede cambiar qué matriz a se refiere a.

2

La matriz a la que hace referencia a se puede modificar, pero la referencia se pasa por valor. Entonces, si hiciera a[0] = 1, estaría cambiando la matriz original. Sin embargo, a = result cambia la referencia, por lo que la referencia original no se modifica.

+0

hmmm alguna idea para implementar mi función? básicamente quiero cambiar el tamaño de mi matriz de 3 a 6 :( –

5

devuelve el parámetro "a" de la función y lo asigna a testArray en la función principal. Cuando pasa un objeto por referencia, la referencia se copia y se le asigna a la función. Entonces el objeto ahora es referenciado por 2 referencias. Cualquier cambio en el objeto a través de la segunda referencia se reflejará en la primera referencia, porque es el mismo objeto al que hacen referencia ambos. Pero cuando cambia la referencia (no el objeto a través de la referencia), es un caso diferente. ha cambiado la segunda referencia para señalar a otro objeto (int [] resultado). Entonces cualquier cambio a través de la segunda referencia cambiará solo el objeto "resultado".

class Test 
{ 
    public static void main(String[] args) 
    { 

     int[] testArray = {1,2,3}; 
     testArray = equalize(testArray, 6); 

     System.out.println("test Array size :" + testArray.length); 
     for(int i = 0; i < testArray.length; i++) 
     System.out.println(testArray[i]); 
    } 

    public static int[] equalize(int[] a, int biggerSize) 
    { 
     if(a.length > biggerSize) 
     throw new Error("Array size bigger than biggerSize"); 

     int[] result = new int[biggerSize]; 
    // System.arraycopy(a, 0, result, 0, a.length); 
    // int array default value should be 0 
     for(int i = 0; i < biggerSize; i++) 
     result[i] = 2; 

     a = result; 
     return a; 
    } 
} 
+0

¿es posible tener vacío (o no devolver nada)? Gracias –

+0

La nueva matriz se crea dentro de la función. Por lo tanto, debe ser devuelto. - Método recomendado. Existen otros enfoques, como inicializar el conjunto de resultados en el exterior y pasarlo como tercer parámetro o definir el tercer parámetro como Hashmap y poner el conjunto de resultados dentro. – Sujee

0

Arrays are Objects in java. Si ha inicializado su matriz con un tamaño (en realidad, la longitud), no puede modificarla. Puede crear una nueva matriz con un tamaño variable (como lo hace actualmente en la función) y copiar todos los valores de la matriz antigua a la nueva matriz. En tu caso, tienes 2 objetos y 3 referencias. Si desea acceder a la matriz de mayor tamaño en la función de llamada, haga que la función devuelva la referencia de la matriz de mayor tamaño.

4

Cuando lo haces a = resultado; objeto a dosent más apuntan a testArray, BC está cambiando su referencia a resultado dirección. Es por eso que ya no tiene efecto en el testArray. Lo que está haciendo en realidad es que usted está haciendo un la misma dirección como resultado tiene, así que lo que cambia en un que va a cambiar en consecuencia también.

Espero que esto ayudó ...

0
public class test 
{ 
    public static void main(String[] args){ 
     int[] a = {15, 2, -3}; 
     printArray(a); 
     changeArray(a); 
     printArray(a); 
    } 
    private static void changeArray(int[] a){ 
     for(int i = 0; i < a.length; i++){ 
      a[i]++; 
     } 
    } 

    private static void printArray(int[] a){ 
     for(int i = 0; i < a.length; i++){ 
      System.out.print(a[i] + " "); 
     } 
     System.out.println(); 
    } 
} 

SALIDA ----- -----

15 2 -3

16 3 -2

+4

Algún tipo si la explicación siempre es buena para ir con el código –

Cuestiones relacionadas