Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich war ziemlich verblüfft, als ich der folgende Code, sah funktioniert nicht wie erwartet.

Ich dachte, Java immer Variablen übergeben durch Verweise in Funktionen. Deshalb, warum kann nicht die Funktion die Variable zuweisen?

public static void main(String[] args) {

  String nullTest = null;

  setNotNull(nullTest);

  System.out.println(nullTest);
}

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

Dieses Programm gibt null.

War es hilfreich?

Lösung

Verweise auf Objekte übergeben werden von Wert in Java so innerhalb der Methode auf die lokale Variable Zuweisung der ursprünglichen Variablen nicht ändert. Nur die lokalen Punkte Variable s auf eine neue Zeichenfolge. Es könnte einfacher sein, mit einer wenig ASCII-Kunst zu verstehen.

Am Anfang haben Sie diese:

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

Wenn Sie zuerst die Methode setNotNull geben Sie erhalten einen Kopie des Wertes von nullt in s. In diesem Fall wird der Wert von nulltest ist eine Nullreferenz:

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

Dann Umhänge s:

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

Und dann lassen Sie die Methode:

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

Andere Tipps

Java tut als Verweis übergibt, es geht um den Wert der Referenz. Wenn Sie s="not null" zuweisen, werden Sie diesen Wert Neuzuweisung.

  

Ich habe gehofft, etwas wie setNotNull zu tun (MyObject o) ohne Verwendung von o = setNotNull (o)

Einfach, können Sie nicht. Die nächstgelegene Sie bekommen ist so etwas wie folgt aus:

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());

, die alle ziemlich klobig ist und wahrscheinlich nicht der Mühe wert.

s =

Dies ist der Grund. Sie sind s Zuordnung nicht das Objekt ändern, die Punkte s.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top