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 genererà un errore di tempo di compilazione se proviamo a modificare 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 argomenti di 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);
}
A Circle viene quindi assegnato un riferimento a un nuovo oggetto Circle con x = y = 0. Questa riassegnazione non ha permanenza, tuttavia, poiché il riferimento è stato passato per valore e non può essere modificato.
Per me questo non assomiglia affatto a riferimenti C ++. Non assomiglia ai normali riferimenti C ++ perché non puoi farne 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 errore di tempo.
Questo è più simile nel comportamento ai puntatori C ++. Puoi usarlo per cambiare i valori degli oggetti appuntiti, ma non puoi cambiare il valore del puntatore stesso in una funzione. Inoltre, come con i puntatori C ++ (ma non con riferimenti C ++), in Java è possibile passare "null" come valore per tale argomento.
Quindi la mia domanda è: perché Java usa la nozione di "riferimento"? Resta inteso che non assomigliano ai riferimenti C ++? Oppure assomigliano davvero ai riferimenti C ++ e mi manca qualcosa?