En C ++, un argument de référence à une fonction permet à la fonction de faire référence à quelque chose d'autre:
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;
}
De façon similaire, un argument de référence constant à une fonction générera une erreur de temps de compilation si nous essayons de changer la référence:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Maintenant, avec Java, les documents disent que les arguments de fonctions de types non primitifs sont des références. Exemple tiré des documents officiels:
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);
}
Ensuite, cercle est assigné une référence à un nouvel objet Circle avec x = y = 0. Cette réaffectation n'a cependant pas de permanence, car la référence a été transmise par valeur et ne peut pas changer.
Pour moi, cela ne ressemble pas du tout aux références C ++. Il ne ressemble pas aux références C ++ normales parce que vous ne pouvez pas le faire référence à autre chose, et il ne ressemble pas aux références const C ++ car en Java, le code qui changerait (mais vraiment pas) la référence ne lance pas de compilation -heure d'erreur.
Ce comportement est plus similaire aux pointeurs C ++. Vous pouvez l'utiliser pour modifier les valeurs des objets pointés, mais vous ne pouvez pas modifier la valeur du pointeur elle-même dans une fonction. En outre, comme avec les pointeurs C ++ (mais pas avec les références C ++), en Java, vous pouvez passer "null" comme valeur pour un tel argument.
Ma question est donc la suivante: pourquoi Java utilise-t-il la notion de «référence»? Faut-il comprendre qu'ils ne ressemblent pas aux références C ++? Ou ressemblent-ils vraiment à des références C ++ et il me manque quelque chose?