W C ++ argument odwołania do funkcji pozwala funkcji na wywołanie odwołania do czegoś innego:
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;
}
Analogicznie, stały argument odwołania do funkcji wyrzuci błąd czasu kompilacji, jeśli spróbujemy zmienić odwołanie:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Teraz, w Javie, doktorzy mówią, że argumenty funkcji typów innych niż pierwotne są referencjami. Przykład z oficjalnych dokumentów:
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);
}
Następnie okrągowi przypisywane jest odwołanie do nowego obiektu Koło za pomocą x = y = 0. To ponowne przypisanie nie ma jednak trwałości, ponieważ odwołanie zostało przekazane przez wartość i nie może się zmienić.
Dla mnie to wcale nie wygląda jak odwołania do C ++. Nie przypomina zwykłych referencji w C ++, ponieważ nie można sprawić, by odnosiły się do czegoś innego, i nie przypomina referencji w stałej C ++, ponieważ w Javie kod, który zmieniłby (ale tak naprawdę nie) referencję nie rzuca kompilacji błąd czasu.
To zachowanie jest bardziej podobne do wskaźników C ++. Możesz go użyć do zmiany wartości wskazanych obiektów, ale nie możesz zmienić samej wartości wskaźnika w funkcji. Ponadto, podobnie jak w przypadku wskaźników C ++ (ale nie w przypadku odniesień do C ++), w Javie można przekazać „null” jako wartość takiego argumentu.
Moje pytanie brzmi: dlaczego Java używa pojęcia „referencja”? Czy należy rozumieć, że nie przypominają one referencji do C ++? A może rzeczywiście przypominają odniesienia do C ++ i czegoś mi brakuje?