У C ++ аргумент посилання на функцію дозволяє функції посилатись на посилання на щось інше:
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;
}
Аналогічно, постійний аргумент посилання на функцію видасть помилку часу компіляції, якщо ми спробуємо змінити посилання:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Тепер, у Java, документи говорять, що аргументи функцій не примітивних типів є посиланнями. Приклад з офіційних документів:
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);
}
Потім колу присвоюється посилання на новий об’єкт Circle з x = y = 0. Однак це переназначення не має постійності, оскільки посилання було передано за значенням і не може змінитися.
Для мене це зовсім не схоже на посилання на C ++. Він не нагадує звичайні посилання на C ++, тому що ви не можете змусити його посилатися на щось інше, і він не нагадує C ++ посилання const, оскільки в Java код, який міняв би (але насправді не робить) посилання, не кидає компіляцію -помилка часу.
Це більш схоже за поведінкою на покажчики C ++. Ви можете використовувати його для зміни значень загострених об'єктів, але ви не можете змінити значення функції вказівника у функції. Також, як і вказівники на C ++ (але не з посиланнями на C ++), у Java ви можете передавати "null" як значення для такого аргументу.
Отже, моє запитання: Чому Java використовує поняття "посилання"? Чи варто розуміти, що вони не нагадують посилання на C ++? Або вони справді нагадують посилання на C ++, і я чогось пропускаю?