2009-12-22 12 views

Respuesta

9

En Java los argumentos pasan por valor, los argumentos del objeto pasan una referencia al objeto, esto significa que puede cambiar la referencia del argumento, pero eso no cambia el objeto al que le pasó la referencia. Tiene dos posibilidades, devolver el nuevo objeto (preferido) o pasar la referencia a un contenedor que puede recibir la nueva referencia (colección, matriz, etc.) Por ejemplo:

private static String changeStringAndReturn(String s) { 
    return new String("new string"); 
} 
private static void changeStringInArray(String[] s) { 
    if (null != s && 0 < s.length) { 
     s[0] = new String("new string"); 
    } 
} 
+5

En Java, los argumentos se pasan por valor! – Tarquila

+2

Lo curioso es que el código es correcto, pero la "documentación" es engañosa. Me pregunto si lo mismo ocurre con su código. – OscarRyz

+0

@ rsp-podría corregir su documentación, ya que es la respuesta aceptada – TStamper

5

Las referencias en Java se pasan por valor, por lo que incluso si modifica la referencia dentro de la función, los cambios no se reflejarán en la función de llamada porque lo que modifica dentro de la función es solo una copia del original referencia no la referencia original en sí.

Pero puede devolver la nueva cadena desde su método changeString en lugar de tratar de modificar la referencia allí (dentro de la función).

4

sólo si realiza la función

private static void changeString(String[] s) { 
    s[0] = new String("new string"); 
} 

String son inmutables, y Java no tiene ningún concepto de un 'puntero a una referencia' como un primer tipo de datos de clase. Si no te gusta lo anterior, puedes hacer una pequeña clase que contenga un solo campo de Cadena.

0

Esto no es posible en Java ya que todo en Java se pasa por valor. En este caso donde el argumento es una referencia de objeto, es el valor de la referencia que se pasa al método, no la referencia en sí misma.

2

A: No se puede, en las referencias de objeto Java se pasan por valor.

Si realmente necesita, puede crear un envoltorio like this y utilizarlo en la forma esperada:

private static void changeString(_<String> str) { 
    str.s("new string"); 
} 

public static void main(String[] args) { 
    _<String> s = new _<String>("old string"); 
    changeString(s); 
    System.out.println(s); // prints "new string" 
} 
2

Puede, por supuesto, devolver la nueva cadena de su método changeString en lugar de intentar cambiarlo en su lugar.

Alternativamente, puede crear un objeto que envuelve o contiene una cadena, y pasarlo. El método ChangeString cambiaría la cadena que era interna para su objeto, y el método principal seguiría manteniendo una referencia a ese objeto .

De lo contrario, no puede hacer esto. La cadena es inmutable, y java siempre pasa objetos como un valor que es un puntero a un objeto particular. Cambie a donde apunta y ya no hace referencia al mismo objeto.

1

Las cadenas son inmutables en Java y los parámetros se pasan por valor para que no pueda cambiarlos (no hay equivalente a ref en C#). Puede pasar un StringBuilder y cambiar el contenido con la misma facilidad.

0

su fea pero se puede cambiar la cadena de estática mundial:

private static String s; 

    private static void changeString(String t) { 
     if(s.equals(t)) 
      s = new String("new string"); 
    } 

    public static void main(String[] args) { 
     s = new String("old string"); 
     changeString(s); 
     System.out.println(s); // expect "new string" 
    } 
Cuestiones relacionadas