Pourquoi ne peut pas ma méthode Java changer une variable passée? [dupliquer]
-
28-09-2019 - |
Question
Cette question a déjà une réponse ici:
J'étais un peu déconcerté quand j'ai vu le code suivant n'a pas fonctionné comme prévu.
Je pensais que Java toujours passé des variables par des références en fonctions. Par conséquent, pourquoi ne peut pas la fonction réassigner 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!";
}
Le null
de ce programme.
La solution
Les références aux objets sont passés par valeur en Java afin attribuer à la variable locale dans la méthode ne change pas la variable d'origine. Seuls les points de s
variable locale à une nouvelle chaîne. Il pourrait être plus facile à comprendre avec un peu d'art ASCII.
Au départ, vous avez ceci:
------------
| nullTest |
------------
|
null
Lorsque vous entrez d'abord la méthode setNotNull vous obtenez une copie de la valeur de nullTest en s
. Dans ce cas, la valeur de nullTest est une référence nulle:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null null
Alors Réattribuer s:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null "not null!"
Et puis laisser la méthode:
------------
| nullTest |
------------
|
null
Autres conseils
Java ne marche pas passer par référence, il passe la valeur de la référence. Lorsque vous assignez s="not null"
, vous Réaffectation cette valeur.
J'espérais faire quelque chose comme setNotNull (MyObject o) sans utiliser o = setNotNull (o)
Simplement, vous ne pouvez pas. Le plus proche que vous obtiendrez est quelque chose comme ceci:
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());
qui est tout plutôt maladroit, et probablement ne vaut pas l'effort.
s =
c'est pourquoi. vous assignez à s, ne pas modifier l'objet qui est des points à.