Einführung
Viele Java-Programmierer stellen die Frage, ob Java per Wert übergeben wird oder per Referenz übergeben wird. Dieser Artikel fasst zusammen, warum Java immer per Wert übergeben wird.
Zuerst, was bedeuten „per Wert übergeben“ und „per Referenz übergeben“?
- Per Wert übergeben: Die Werte der Methodenparameter werden in eine andere Variable kopiert, und dann wird das kopierte Objekt an die Methode übergeben. Die Methode verwendet die Kopie.
- Per Referenz übergeben: Ein Alias oder eine Referenz zum tatsächlichen Parameter wird an die Methode übergeben. Die Methode greift auf den tatsächlichen Parameter zu.
Oft entsteht Verwirrung um diese Begriffe durch das Konzept des Objektverweises in Java. Technisch gesehen wird in Java immer per Wert übergeben, denn auch wenn eine Variable einen Verweis auf ein Objekt enthält, ist dieser Objektverweis ein Wert, der den Speicherort des Objekts repräsentiert. Objektverweise werden daher per Wert übergeben.
Sowohl Referenzdatentypen als auch primitive Datentypen werden per Wert übergeben. Erfahren Sie mehr über Datentypen in Java.
Zusätzlich zum Verständnis von Datentypen ist es auch wichtig, das Speicherzuweisung in Java zu verstehen, da Referenzdatentypen und primitive Datentypen unterschiedlich gespeichert werden.
Demonstration von Wertübergabe
Das folgende Beispiel zeigt, wie Werte in Java übergeben werden.
Das Beispielprogramm verwendet die folgende Klasse:
public class Balloon {
private String color;
public Balloon() {}
public Balloon(String c) {
this.color = c;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
Das folgende Beispielprogramm verwendet eine generische Methode, swap()
, die zwei Variablen vertauscht. Eine weitere Methode, changeValue()
, versucht, die Variablenwerte zu ändern.
public class Test {
public static void main(String[] args) {
Balloon red = new Balloon("Red"); // Speicherreferenz = 50
Balloon blue = new Balloon("Blue"); // Speicherreferenz = 100
swap(red, blue);
System.out.println("After the swap method executes:");
System.out.println("`red` color value = " + red.getColor());
System.out.println("`blue` color value = " + blue.getColor());
changeValue(blue);
System.out.println("After the changeValue method executes:");
System.out.println("`blue` color value = " + blue.getColor());
}
// Generische Tauschmethode
public static void swap(Object o1, Object o2){
Object temp = o1;
o1 = o2;
o2 = temp;
}
private static void changeValue(Balloon balloon) { // balloon = 100
balloon.setColor("Red"); // balloon = 100
balloon = new Balloon("Green"); // balloon = 200
balloon.setColor("Blue"); // balloon = 200
}
}
Wenn Sie das Beispielprogramm ausführen, erhalten Sie die folgende Ausgabe:
OutputAfter the swap method executes:
'red' color value = Red
'blue' color value = Blue
After the changeValue method executes:
'blue' color value = Red
Die Ausgabe zeigt, dass die Methode swap()
die Farbwerte der Originalobjekte nicht vertauscht hat. Dies hilft zu zeigen, dass Java nach Wert übergibt, da die Methode swap()
nur auf Kopien der ursprünglichen Objektreferenzwerte wirkt.
Dieser Test der swap()
-Methode kann mit jeder Programmiersprache verwendet werden, um zu überprüfen, ob sie nach Wert oder nach Referenz übergibt.
Die Beispiel-Methode swap()
erklärt
Wenn Sie den Operator new
verwenden, um eine Instanz einer Klasse zu erstellen, wird das Objekt erstellt und die Variable enthält den Speicherort, an dem das Objekt gespeichert ist.
Balloon red = new Balloon("Red");
Balloon blue = new Balloon("Blue");
Hier ist eine schrittweise Aufschlüsselung dessen, was passiert, wenn die Methode swap()
ausgeführt wird:
-
Annehmen, dass
rot
auf den Speicherort 50 undblau
auf den Speicherort 100 zeigt, und dass dies die Speicherorte beiderBalloon
-Objekte sind. -
Wenn die Klasse die Methode
swap()
mit den Variablenrot
undblau
als Argumente aufruft, werden zwei neue Objektvariablen,o1
undo2
, erstellt.o1
undo2
zeigen ebenfalls auf die Speicherorte 50 und 100, respectively. -
Der folgende Codeausschnitt erläutert, was innerhalb der Methode
swap()
passiert:public static void swap(Object o1, Object o2) { // o1 = 50, o2 = 100 Object temp = o1; // weist den Objektverweiswert von o1 temp zu: temp = 50, o1 = 50, o2 = 100 o1 = o2; // weist den Objektverweiswert von o2 zu o1 zu: temp = 50, o1 = 100, o2 = 100 o2 = temp; // weist den Objektverweiswert von temp zu o2 zu: temp = 50, o1 = 100, o2 = 50 } // Methode beendet
-
Die Werte von
o1
undo2
werden vertauscht, aber da die Werte Kopien der Speicherortered
undblue
sind, ändern sich die Werte der Farbwertered
undblue
nicht.
Da die Variablen den Verweis auf die Objekte enthalten, ist es ein häufiger Fehler anzunehmen, dass der Verweis übergeben wird und Java by Reference ist. Tatsächlich wird ein Wert übergeben, der eine Kopie des Verweises ist, und daher handelt es sich um eine Übergabe nach Wert.
Die Methode changeValue()
im Beispiel erklärt
Die nächste Methode im Beispielprogramm ändert den Farbwert des Objekts, auf das die Variable blue
verweist:
private static void changeValue(Balloon balloon) { // balloon = 100
balloon.setColor("Red"); // balloon = 100
balloon = new Balloon("Green"); // balloon = 200
balloon.setColor("Blue"); // balloon = 200
}
Hier ist eine schrittweise Aufschlüsselung dessen, was innerhalb der Methode changeValue()
passiert:
-
Die Klasse ruft die Methode
changeValue()
auf der Variablenblue
auf, die auf den Speicherort 100 verweist. Die erste Zeile erstellt eine Referenz, die ebenfalls auf den Speicherort 100 zeigt. Der Farbwert des Objekts am Speicherort 100 wird zu"Rot"
geändert. -
Die zweite Zeile erstellt ein neues Objekt (mit Farbwert
"Grün"
). Das neue Objekt befindet sich am Speicherort 200. Alle weiteren Methoden, die auf die Variableballoon
angewendet werden, wirken auf das Objekt am Speicherort 200 und beeinflussen nicht das Objekt am Speicherort 100. Die neue Variableballoon
überschreibt die in Zeile 1 erstellte Referenz, und dieballoon
-Referenz aus Zeile 1 ist innerhalb dieser Methode nicht mehr zugänglich. -
Die dritte Zeile ändert den Farbwert des neuen
Balloon
-Objekts am Speicherort 200 auf"Blau"
, beeinflusst jedoch nicht das ursprüngliche Objekt, auf dasblue
am Speicherort 100 verweist. Dies erklärt, warum die letzte Zeile des Beispielausgabe-Programmsblue color value = Rot
ausgibt, was die Änderung von Zeile 1 widerspiegelt.
Schlussfolgerung
In diesem Artikel haben Sie gelernt, warum Java nach Wert übergeben wird. Setzen Sie Ihr Lernen mit weiteren Java-Tutorials fort.
Source:
https://www.digitalocean.com/community/tutorials/java-is-pass-by-value-and-not-pass-by-reference