# Worin besteht der Unterschied zwischen call by reference und call by value?



## Unbekannte20 (11. Dez 2019)

Worin besteht der Unterschied zwischen call by reference und call by value?


----------



## abc66 (11. Dez 2019)

Java is strikt call by value.


----------



## abc66 (11. Dez 2019)

call by reference heißt, der Callee kann das referenzierte Objekt und auch die Referenz an sich verändern.


----------



## Blender3D (11. Dez 2019)

Unbekannte20 hat gesagt.:


> Worin besteht der Unterschied zwischen call by reference und call by value?


call by value -> es wird eine Kopie übergeben
call by reference -> es wird ein Zeiger auf die Daten übergeben
Die Objekte sind in Java Referenzen.


----------



## abc66 (11. Dez 2019)

nachträglich ein Link: https://www.educative.io/edpresso/pass-by-value-vs-pass-by-reference


----------



## abc66 (11. Dez 2019)

Blender3D hat gesagt.:


> call by referebce -> es wird ein constater Zeiger auf die Daten übergeben


Aber nicht zwingend konstanter 

Die Fachwelt scheidet sich ein bisschen beim Punkt, ob Java bei Referenzen nicht call by reference is. Ich würd diesen Punkt also nicht unbedingt als Fehler bewerten.


----------



## Blender3D (11. Dez 2019)

abc66 hat gesagt.:


> Die Fachwelt scheidet sich ein bisschen beim Punkt, ob Java bei Referenzen nicht call by reference is. Ich würd diesen Punkt also nicht unbedingt als Fehler bewerten.


*call by Reference: *Es wird ein Zeiger übergeben. In Java immer ein konstanter Pointer also eine Referenz. In C sind auch echte Pointer möglich. Das heißt: Der Zeiger ist nicht Konstant und kann verändert werden. Stichwort Pointer Arithmetik.
Dadurch kann die aufgerufene Funktion, die Daten des übergebenen Objekt sofern es nicht konstant ist und die Daten zugängig sind verändern. Nach der Rückkehr aus der Funktion sind die Daten auch im aufrufendem Teil verändert. 
*call by Value:* Es wird eine Kopie übergeben. Diese kann in der aufgerufenen Funktion geändert werden. Nach der Rückkehr ist das kopierte Objekt aber unverändert.


----------



## mihe7 (11. Dez 2019)

cbv -> kopiert den Wert des Arguments, cbr -> kopiert die Adresse des Arguments. In Java gibt es nur cbv.


----------



## Blender3D (12. Dez 2019)

*Achtung* mit "Java ist immer Call-by-Value" man muss unterscheiden: 
*1.  primitive Datentypen* (byte, short, int, long, float, double, char, boolean und als ausnahme String):       Call-by-Value 
*2. komplexe Datentypen genauer referenztypen* (List oder jedes ander Oject (z. B. MyClass c = new MyCass():       Call-by-Value kopiert *nur die Referenz* daher verhält es sich *wie Call-by-Reference!* 
Trozdem wird Java als immer Call-by-Value bezeichnet.


----------



## mihe7 (12. Dez 2019)

Blender3D hat gesagt.:


> Call-by-Value kopiert *nur die Referenz* daher verhält es sich *wie Call-by-Reference!*


Nein, das verhält sich nicht wie CBR - und Java ist immer CBV.

Nehmen wir mal eine Variable "var" an. Die stehe an Adresse x. Dort sei ein Wert y abgelegt - bei primitiven Typen ist es (EDIT: das y) der Wert selbst, bei Referenztypen eine Referenz (EDIT: besser Adresse), das spielt aber keine Rolle.

An die Methode wird bei CBV das y, bei CBR das x übergeben. Das hat zur Folge, dass sich im Fall von CBR eine Zuweisung an den Parameter auf die Variable "var" auswirkt, während man im Fall von CBV dem Parameter zuweisen kann, was man will - das interessiert die Variable "var" nicht.


----------



## Blender3D (12. Dez 2019)

mihe7 hat gesagt.:


> Nein, das verhält sich nicht wie CBR - und Java ist immer CBV.


Klar Java ist semantisch immer CBV. Stimmt aber das Ergebnis ist trotzdem, dass die Daten des Objekts nach außen gereicht werden könne. Das ist mit. Es verhält sich wie CBR gemeint. Es ist eine Mahnung zur Vorsicht.


----------



## mihe7 (12. Dez 2019)

Ach so, dann hab ich Dich falsch verstanden


----------



## abc66 (12. Dez 2019)

Auch Stack Overflow beantwortet diese Frage klar mit cbv. Bei Referenzen habe ich eben nicht die Möglichkeit, eine andere Referenz an diese Stelle zuzuweisen mit Auswirkungen auf den Caller. Und wenn ich ein immutable Objekt übergebe, kann der Caller sogar sichergehen, das sein Objekt nach Rückkehr unverändert ist...


----------



## kneitzel (12. Dez 2019)

Wer sich hier etwas unsicher ist, dann evtl. einfach noch einmal eine kleine Verdeutlichung (wobei eigentlich alles gesagt ist, aber wenn die Begründung teilweise nur ist "Steht so bei SO", dann reicht es evtl. doch noch nicht):

Bei Call By Reference geht es nicht darum, dass einfach irgend eine Referenz übergeben wird. (Also z.B. eine Referenz auf ein Objekt) sondern es geht ganz klar um eine Referenz auf eine Variable vom vorgegebenen Typ. Und genau solche Referenzen auf Variablen kennt Java nicht.

Und das bedeutet für einen Parameter vom Typ Object oder abgeleitet zwar, dass eine Referenz übergeben wird. Aber das ist nur eine Referenz auf eine Instanz vom Typ Object (oder abgeleitet) oder eben null. Call By Referenz müsste aber eben eine Referenz auf eine Variable vom Typ Object sein (Also sozusagen eine Reference auf eine Referenz...

Die Verwirrung kommt hier nur auf, weil das Wort "Referenz" in für zwei eigentlich unterschiedliche Dinge verwendet wird.


----------



## mihe7 (12. Dez 2019)

JustNobody hat gesagt.:


> Und genau solche Referenzen auf Variablen kennt Java nicht.


Das gefällt mir sehr gut.

Weniger genau, dafür vielleicht etwas einprägsamer, ohne die technischen Hintergründe genauer kennen zu müssen:

Steht der Parameter der aufgerufenen Methode für eine Kopie der übergebenen Variable -> CBV
Steht der Parameter der aufgerufenen Methode stellvertretend für die übergebene Variable -> CBR


----------

