In Java wird ein Array nach Wert übergeben, aber der Wert ist ein Verweis auf ein Array. Angenommen, Sie haben ein Array arr
. Wenn Sie es übergeben, können Sie das Array ändern, auf das arr
verweist, aber Sie können nicht ändern, auf welches Array arr
verweist. d. h. innerhalb einer Methode können Sie das referenzierte Objekt ändern, aber Sie können die übergebene Variable, die immer noch eine Referenz auf dasselbe Objekt darstellt, nicht ändern. Ich werde versuchen, mit einem Beispiel zu veranschaulichen:
Ausgabe:
%Vor% Sie können aus dem Beispiel sehen, dass First Second
in der Ausgabe statt in Second First
erhalten wird. Dies liegt daran, dass in der Funktion swap
Kopien verwendet wurden, die keinen Einfluss auf die Referenzen im Hauptteil haben. Dies veranschaulicht die Tatsache, dass Sie die übergebene Variable nicht ändern können, die immer noch eine Referenz auf das gleiche Objekt sein wird. Die Funktion change
bringt jedoch den gewünschten Effekt, weil Sie das referenzierte Objekt ändern können.
Weitere Informationen finden Sie hier:
Ist Java "pass-by-reference"?
Das könnte eine unpopuläre Art sein, darüber nachzudenken, aber selbst von einer C / C ++ Seite zu sein, hat es mir leichter gemacht.
In Java sind Objekte Referenztypen . Das bedeutet, dass sich das tatsächliche Objekt irgendwo auf dem Heap befindet und dass Sie tatsächlich nur eine Referenz für dieses Objekt verwenden. Daher ist es einfacher, es in Form von C-Zeigern (als Analogie) zu denken.
%Vor%würde sich ähnlich wie in C / C ++
verhalten %Vor%Ähnlich verhalten sie sich bei Funktionen so, als würden die Parameter der Funktion als Zeiger übergeben. Ähnlich wie Sie Pass-by-Reference in C
simulieren würden %Vor%Ist mehr wie die unten stehende C-Version
%Vor%und solange Sie den Wert des Zeigers selbst nicht ändern (in Java durch Neuzuweisen der Variablen mit einer neuen Instanz), können Sie damit auf die ursprüngliche Instanz zugreifen und diese ändern.
Und um alles zusammenzufassen, sind ALLE Typen außer den primitiven Typen ( int
, double
, boolean
usw.) Referenztypen (sogar Typen wie Integer
, Double
, Boolean
und Arrays)
Wie andere bereits erklärt haben, müssen Sie nicht das &
hinzufügen, damit es sich so verhält, wie Sie es erwarten würden (mit Ausnahme bestimmter Vorbehalte wie die Zuweisung mit einer neuen Instanz)