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.
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.
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.
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.
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.
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...
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.
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