¿Por qué no puede mi método Java cambiar una variable pasada? [duplicar]
-
28-09-2019 - |
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- es Java “pase por referencia” o “pass-by-value “? 84 respuestas
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
.
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.