In C ++ un argomento di riferimento a una funzione consente alla funzione di fare riferimento a qualcos'altro:
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;
}
Analogamente, un argomento di riferimento costante a una funzione genera un errore in fase di compilazione se proviamo a cambiare il riferimento:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Ora, con Java, i documenti dicono che gli argomenti delle funzioni di tipi non primitivi sono riferimenti. Esempio dai documenti ufficiali:
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);
}
Then circle is assigned a reference to a new Circle object with x = y = 0. This reassignment has no permanence, however, because the reference was passed in by value and cannot change.
Per me questo non assomiglia affatto ai riferimenti C ++. Non assomiglia ai normali riferimenti C ++ perché non è possibile fare riferimento a qualcos'altro, e non assomiglia ai riferimenti const C ++ perché in Java, il codice che cambierebbe (ma in realtà non lo fa) il riferimento non genera una compilazione -time error.
Questo è più simile nel comportamento ai puntatori C ++. Puoi usarlo per modificare i valori degli oggetti appuntiti, ma non puoi modificare il valore del puntatore stesso in una funzione. Inoltre, come con i puntatori C ++ (ma non con i riferimenti C ++), in Java puoi passare "null" come valore per tale argomento.
Quindi la mia domanda è: perché Java usa la nozione di "riferimento"? Si deve capire che non assomigliano ai riferimenti C ++? O davvero assomigliano davvero ai riferimenti C ++ e mi manca qualcosa?