В 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 ++, потому что в Java код, который изменит (но на самом деле не делает) ссылку, не вызывает компиляцию ошибка
По поведению это больше похоже на указатели C ++. Вы можете использовать его для изменения значений указанных объектов, но вы не можете изменить само значение указателя в функции. Кроме того, как и в случае с указателями C ++ (но не со ссылками на C ++), в Java вы можете передать «null» в качестве значения для такого аргумента.
Итак, мой вопрос: почему Java использует понятие «ссылка»? Следует ли понимать, что они не похожи на ссылки C ++? Или они действительно напоминают ссылки на C ++, а я что-то упустил?