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.

Était-ce utile?

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 à.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top