Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Yo estaba un poco desconcertado cuando vi el siguiente código no funcionó como se esperaba.

pensé Java siempre pasó por las variables referencias en funciones. Por lo tanto, ¿por qué no puede volver a asignar la función de la variable?

public static void main(String[] args) {

  String nullTest = null;

  setNotNull(nullTest);

  System.out.println(nullTest);
}

private static void setNotNull(String s) {
  s = "not null!";
}

Este programa salidas null.

¿Fue útil?

Solución

Las referencias a objetos se pasan por valor en Java por lo que la asignación a la variable local dentro del método no cambia la variable original. Sólo los puntos variables locales s a una nueva cadena. Puede ser que sea más fácil de entender con un poco de arte ASCII.

Inicialmente usted tiene esto:

------------
| nullTest |
------------
     |
    null

Al entrar en la setNotNull método se obtiene un copia del valor de nullTest en s. En este caso el valor de nullTest es una referencia nula:

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null            null

s continuación reasigne:

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null         "not null!"

Y luego dejar el método:

------------
| nullTest |
------------
     |
    null

Otros consejos

Java doesnt pasar por referencia, se pasa el valor de la referencia. Cuando se está asignando s="not null", que está reasignando ese valor.

  

Tenía la esperanza de hacer algo como setNotNull (MiObjeto o) sin utilizar o = setNotNull (o)

Simplemente, no se puede. Lo más cerca que se obtiene es algo como esto:

public class MyRef<T> {
    private T obj;

    public T get() {
        return obj;
    }

    public void set(T obj) {
        this.obj = obj;
    }

    public void setNotNull(T obj) {
        if (this.obj == null) {
            this.obj = obj;
        }
    }
}

MyRef<MyObj> ref = new MyRef<MyObj>();
ref.setNotNull(xyz);
System.err.println(ref.get());

que es todo bastante torpe, y probablemente no vale la pena el esfuerzo.

s =

Este es el por qué. está asignando a s, no modificar el objeto que es a puntos.

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