HOWTO · Java

Array übergeben als Wert oder übergeben als Referenz in Java

Dieser Artikel stellt die Überprüfung vor, ob ein Array als Wert oder als Referenz in Java übergeben wird.

Auf dieser Seite

Java übergibt jedes Methodenargument als Wert. Ist das Argument ein Array, wird eine Referenz auf das Array-Objekt als Wert in den Parameter kopiert. Aufrufer und Parameter können daher auf dasselbe Objekt verweisen, bleiben aber getrennte Variablen. Deshalb sieht der Aufrufer eine Änderung an einem Element, nicht jedoch die Zuweisung eines anderen Arrays an den Parameter.

Wie Java Argumente übergibt

Eine Referenz ist ein Wert, mit dem Code auf ein Objekt zugreifen kann; sie ist nicht das Objekt selbst. Eine Methode erhält eine Kopie dieses Referenzwerts. Zu Beginn eines Aufrufs verweisen die Array-Variable des Aufrufers und der Methodenparameter auf dasselbe Array-Objekt. Java übergibt die Array-Variable selbst nicht als Referenz. Deshalb kann die Methode die Variable des Aufrufers nicht ersetzen, indem sie ihrem eigenen Parameter ein anderes Array zuweist.

Entscheidend ist der Unterschied zwischen einer Änderung am Objekt und einer Änderung an einer Variable. Eine Zuweisung an ein Array-Element ändert das gemeinsam genutzte Objekt. Eine Zuweisung an den Parameter ändert nur dessen kopierte Referenz. Obwohl beide Vorgänge innerhalb der aufgerufenen Methode stattfinden, haben sie unterschiedliche Auswirkungen.

Wie sich Änderungen an Array-Elementen auf den Aufrufer auswirken

Wenn eine Methode in values[index] schreibt, ändert sie ein Element des Array-Objekts, auf das beide Referenzen zugreifen können. Nach der Rückkehr der Methode sieht der Aufrufer dieses geänderte Element. Die Referenz wurde als Wert übergeben; die Änderung am Element ist sichtbar, weil die kopierte Referenz weiterhin auf dasselbe Objekt verweist.

Was passiert, wenn eine Methode einen Array-Parameter neu zuweist

Wird dem Parameter ein neues Array zugewiesen, verweist er anschließend auf ein anderes Objekt. Die Variable des Aufrufers ändert sich dadurch nicht und verweist weiterhin auf das ursprüngliche Array. Änderungen am ursprünglichen Objekt, die vor der Neuzuweisung vorgenommen wurden, kann der Aufrufer sehen; die neue Referenz des Parameters erhält er jedoch nicht. Um das Array des Aufrufers zu ersetzen, kann die Methode das neue Array zurückgeben und der Aufrufer den Rückgabewert an der Aufrufstelle zuweisen. Alternativ kann die Methode das ursprüngliche Array ändern.

Wie sich primitive Parameter verhalten

Auch primitive Argumente werden als Wert übergeben: Der Parameter beginnt mit einer Kopie des primitiven Werts. Weist eine Methode diesem Parameter eine andere Zahl zu, bleibt die Variable des Aufrufers unverändert. Das entspricht der Neuzuweisung eines Array-Parameters, nicht der Änderung eines Array-Elements. Beim Array kommt eine Referenz hinzu: Mit dem kopierten Wert lässt sich das gemeinsam genutzte Objekt ändern, während eine neue Referenz nur den lokalen Parameter betrifft.

Führe dieses eigenständige Beispiel aus. Klassenname und Bezeichner im unveränderten Beispielcode bleiben englisch; die Ausgabe zeigt die drei Werte 9, 9 und 1:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

public class ArrayArgumentDemo {
    static void changeFirst(int[] values) {
        values[0] = 9;
    }

    static void replaceParameter(int[] values) {
        values = new int[] {7, 8};
    }

    static void changeNumber(int number) {
        number = 9;
    }

    public static void main(String[] args) {
        int[] numbers = {1, 2};
        changeFirst(numbers);
        System.out.println(numbers[0]);
        replaceParameter(numbers);
        System.out.println(numbers[0]);

        int count = 1;
        changeNumber(count);
        System.out.println(count);
    }
}
9
9
1

Die erste Ausgabe zeigt das geänderte Element. Die zweite zeigt, dass das Array des Aufrufers unverändert bleibt, nachdem dem Methodenparameter ein anderes Array zugewiesen wurde. Die letzte Ausgabe zeigt, dass auch die primitive Variable des Aufrufers unverändert bleibt.

Wichtigste Erkenntnis

Java übergibt Argumente immer als Wert, auch Array-Referenzen. Eine Änderung an einem Element ist sichtbar, wenn die Variable des Aufrufers und der Methodenparameter auf dasselbe Array-Objekt verweisen. Eine Neuzuweisung ändert nur die lokale Referenz des Parameters; eine Zuweisung an einen primitiven Parameter ändert nur dessen lokale Kopie. Wer Änderungen am Objekt von Zuweisungen an den Parameter unterscheidet, kann das Verhalten zuverlässig vorhersagen.