In C ++ ermöglicht ein Referenzargument für eine Funktion der Funktion, die Referenz auf etwas anderes zu verweisen:
int replacement = 23;
void changeNumberReference(int& reference) {
reference = replacement;
}
int main() {
int i = 1;
std::cout << "i=" << i << "\n"; // i = 1;
changeNumberReference(i);
std::cout << "i=" << i << "\n"; // i = 23;
}
Analog löst ein konstantes Referenzargument für eine Funktion einen Fehler bei der Kompilierung aus, wenn wir versuchen, die Referenz zu ändern:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
In Java heißt es in den Dokumenten, dass Funktionsargumente nicht-primitiver Typen Referenzen sind. Beispiel aus den offiziellen Dokumenten:
public void moveCircle(Circle circle, int deltaX, int deltaY) {
// code to move origin of circle to x+deltaX, y+deltaY
circle.setX(circle.getX() + deltaX);
circle.setY(circle.getY() + deltaY);
// code to assign a new reference to circle
circle = new Circle(0, 0);
}
Dann wird circle eine Referenz auf ein neues Circle-Objekt mit x = y = 0 zugewiesen. Diese Neuzuweisung hat jedoch keine Permanenz, da die Referenz als Wert übergeben wurde und sich nicht ändern kann.
Für mich sieht das überhaupt nicht nach C ++ Referenzen aus. Es ähnelt keinen regulären C ++ - Referenzen, weil Sie nicht festlegen können, dass es auf etwas anderes verweist, und es ähnelt keinen C ++ - const-Referenzen, weil in Java der Code, der die Referenz ändern würde (aber wirklich nicht), keine Kompilierung auslöst -Zeitfehler.
Dies ähnelt eher dem Verhalten von C ++ - Zeigern. Sie können es verwenden, um die Werte der angezeigten Objekte zu ändern, aber Sie können den Wert des Zeigers selbst in einer Funktion nicht ändern. Ebenso wie bei C ++ - Zeigern (aber nicht bei C ++ - Referenzen) können Sie in Java "null" als Wert für ein solches Argument übergeben.
Meine Frage lautet also: Warum verwendet Java den Begriff "Referenz"? Ist zu verstehen, dass sie nicht C ++ Referenzen ähneln? Oder ähneln sie tatsächlich C ++ - Referenzen und mir fehlt etwas?