En C ++, un argumento de referencia a una función permite que la función haga que la referencia se refiera a otra cosa:
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;
}
Análogamente, un argumento de referencia constante a una función arrojará un error de tiempo de compilación si intentamos cambiar la referencia:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Ahora, con Java, los documentos dicen que los argumentos de funciones de tipos no primitivos son referencias. Ejemplo de los documentos oficiales:
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);
}
Luego, al círculo se le asigna una referencia a un nuevo objeto Circle con x = y = 0. Sin embargo, esta reasignación no tiene permanencia porque la referencia se pasó por valor y no puede cambiar.
Para mí, esto no se parece en nada a las referencias de C ++. No se parece a las referencias regulares de C ++ porque no puede hacer que se refiera a otra cosa, y no se parece a las referencias constantes de C ++ porque en Java, el código que cambiaría (pero realmente no) la referencia no arroja una compilación error de tiempo
Esto es más similar en comportamiento a los punteros de C ++. Puede usarlo para cambiar los valores de los objetos puntiagudos, pero no puede cambiar el valor del puntero en una función. Además, como con los punteros de C ++ (pero no con las referencias de C ++), en Java puede pasar "nulo" como valor para dicho argumento.
Entonces mi pregunta es: ¿Por qué Java usa la noción de "referencia"? ¿Debe entenderse que no se parecen a las referencias de C ++? ¿O realmente se parecen a las referencias de C ++ y me falta algo?