Java ist nach Wert übergeben, nicht nach Referenz übergeben.

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:

Output
After 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 und blau auf den Speicherort 100 zeigt, und dass dies die Speicherorte beider Balloon-Objekte sind.

  • Wenn die Klasse die Methode swap() mit den Variablen rot und blau als Argumente aufruft, werden zwei neue Objektvariablen, o1 und o2, erstellt. o1 und o2 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 und o2 werden vertauscht, aber da die Werte Kopien der Speicherorte red und blue sind, ändern sich die Werte der Farbwerte red und blue 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 Variablen blue 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 Variable balloon angewendet werden, wirken auf das Objekt am Speicherort 200 und beeinflussen nicht das Objekt am Speicherort 100. Die neue Variable balloon überschreibt die in Zeile 1 erstellte Referenz, und die balloon-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 das blue am Speicherort 100 verweist. Dies erklärt, warum die letzte Zeile des Beispielausgabe-Programms blue 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