No C ++, um argumento de referência para uma função permite que a função faça a referência se referir a outra coisa:
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, um argumento de referência constante para uma função gerará um erro de tempo de compilação se tentarmos alterar a referência:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Agora, com Java, os documentos dizem que argumentos de funções de tipos não primitivos são referências. Exemplo dos documentos oficiais:
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);
}
No círculo, é atribuída uma referência a um novo objeto Circle com x = y = 0. Essa reatribuição não tem permanência, no entanto, porque a referência foi passada por valor e não pode ser alterada.
Para mim, isso não parece nada com referências de C ++. Ele não se assemelha a referências regulares em C ++ porque você não pode fazer referência a outra coisa, e não se assemelha a referências const C ++ porque em Java, o código que mudaria (mas realmente não) a referência não gera uma compilação erro de tempo.
Esse comportamento é mais semelhante aos ponteiros C ++. Você pode usá-lo para alterar os valores dos objetos apontados, mas não pode alterar o valor do ponteiro em uma função. Além disso, como nos ponteiros C ++ (mas não nas referências C ++), em Java, você pode passar "null" como valor para esse argumento.
Então, minha pergunta é: Por que o Java usa a noção de "referência"? É preciso entender que eles não se parecem com referências de C ++? Ou eles realmente se parecem com referências de C ++ e estou perdendo alguma coisa?