Variablen werden an eine Methode mit Call-By-Value übergeben, wenn der Wert der Variable in die Funktionsvariable, welche im Methodenkopf definiert wurde, kopiert wird.
Variablen werden an eine Methode mit Call-By-Reference übergeben, wenn nur eine Referenz auf die Speicheradresse an die Funktionsvariable übergeben wird, nicht aber der Wert der Variable selbst.
Erklärung
Eine Variable besteht grundlegend aus zwei Teilen. Dem Variablen-Namen und dem Variablen-Wert. Computer speichern dabei Variablen-Werte im Speicher. Leider sind Speicher-Adressen für Menschen nur schwer lesbar. Daher repräsentieren Variablen-Namen schöne, für Menschen lesbare, Ausdrücke, welche auf diese Werte verweisen. So kann zum Beispiel der Variablen kontostand
sofort eine Bedeutung zugewiesen werden, während dies bei 0101110010... nur schwer möglich ist. Neben dem Wert und dem menschenlesbaren Namen gibt es noch eine Referenz. Diese zeigt auf die Adresse im Speicher, wo der Variablen-Wert gespeichert ist.
Call by Value
Variablen werden beim Methoden-Aufruf an eine Methode mit Call-By-Value übergeben, wenn der Variablen-Wert in den Variablen-Wert der Funktionsvariable kopiert wird.
Sieh dir folgendes Beispiel an:
Der Variablen-Wert ist hier das Getränk. Der Trinkhalm ist die Variablen-Referenz.
Beim Methoden-Aufruf wird der Variablen-Wert kopiert die Referenz in die Funktionsvariable kopiert. Bei Änderungen an der Funktionsvariable, der Kopie, ändert sich nichts an der Ursprungsvariable. Jan kann also in Ruhe sein Getränk genießen.
Call by Reference
Variablen werden beim Methoden-Aufruf an eine Methode mit Call-By-Reference übergeben, wenn nur die Referenz auf den Variablen-Wert im Speicher übergeben wird.
Betrachte erneut folgendes Beispiel:
Beim Methoden-Aufruf wird nur die Referenz (der Trinkhalm) kopiert. Es existieren folglich zwei Variablen mit Referenzen auf denselben Variablen-Wert im Speicher. Wird nun aus einem der beiden Trinkhalme getrunken, so leert sich die Flasche. Es wird von beiden Instanzen derselbe Variablen-Wert verändert.
Methodenaufrufe in Java
Im Gegensatz zu vielen anderen Programmiersprachen gibt es in Java nur Call-by-Value. Das kann vorteilhaft sein. Es ist jedoch immer wichtig, dass du dir bewusst machst, wie Referenzen beim Methodenaufruf gehandhabt werden. So kannst du in Java eben kein Call-by-Reference nutzen und so keine Variablen-Referenz an eine Methode übergeben.
Beispiel
Jan hat Hunger. Daher definiert er sich eine Methode eatFood
, welche ein Essen als String entgegennimmt und true
zurückgibt, wenn das Essen ausreichend war sowie false
, wenn das Essen nicht ausreichen war.
Wenn der String food
also nicht leer ist (food != ""
), dann setzt die Methode den String gleich dem leeren String food = ""
(das Essen wurde gegessen) und gibt true
zurück. Wenn der String bereits leer war, wird false zurückgegeben.
Besuche die App, um alle Inhalte zu sehen!
Nach der Methodendefinition kann Jan diese endlich aufrufen und seinen Burger essen:
Besuche die App, um alle Inhalte zu sehen!
Beim Methodenaufruf wird der Variablen-Wert der Variable burger
in die Methodenvariable food
kopiert. Da burger nicht leer war, wird die Bedingung food != ""
zu true
ausgewertet. Der Burger wird gegessen, indem food
jetzt auf den leeren String ""
gesetzt wird und Jan ist happy (es wird true zurückgegeben).
Beim Methoden-Aufruf ist jedoch etwas Merkwürdiges passiert: die Variable isJanHappy
hat nun den Wert true
, das Essen war erfolgreich, jedoch ist der Wert der Variable burger
weiterhin "Burger". Wie kann das sein?
In Java arbeiten alle Parameterübergaben mit Call-by-Value. Da der Wert "Burger" aus der Variablen burger
nur in die Variable food
kopiert wurde, bleibt diese außerhalb der Methode unverändert. Es wurde nur food
innerhalb der Methode auf leer gesetzt. Dies hatte keine Auswirkungen auf die Variable burger
.
Dank Call-by-Value kann Jan also so oft die Methode aufrufen wie er möchte, sein Burger wird nie verschwinden.