А кто имеет полномочия решать?
Редактировать: По-видимому, мне не удалось правильно сформулировать свой вопрос.
Я не спрашиваю, как работает передача аргументов Java. Я знаю, что то, что выглядит как переменная, содержащая объект, на самом деле является переменной, содержащей ссылку на объект, и эта ссылка передается по значению.
Есть много прекрасных объяснений этого механизма здесь (в связанных потоках и других) и в других местах.
Вопрос касается технического значения термина pass-by-reference. (Конец редактирования)
Я не уверен, что это правильный вопрос для SO, извините, если нет, но я не знаю лучшего места. Многое уже было сказано в других вопросах здесь, например Является ли Java «передачей по ссылке» или «передачей по значению»? и передача по ссылке или передача по значению? , но я не нашел авторитетного ответа на вопрос, что означает этот термин.
Я думал, что «передать по ссылке» означает «передать ссылку (обычно указатель) на объект», чтобы вызываемый объект мог изменить объект, который видит вызывающий объект, тогда как «передать по значению» означает копирование объекта, и позволить вызываемому пользователю повеселиться с копией (очевидная проблема: что, если объект содержит ссылки, глубокое копирование или мелкое).
Пой, что FW поворачивается вверх лотов из мест Говоря"передать по ссылке" означает только то, здесь некоторый аргумент, что это означает больше, но определение все еще читает
Режим ParameterPassing, в котором ссылка (или, если вы хотите быть политически некорректным, указатель) на фактический параметр передается в формальный параметр; когда вызываемый объект нуждается в формальном параметре, он разыменовывает указатель для его получения.
Я не нашел много мест, дающих более четкое определение термина, на этой странице я обнаружил, что «lvalue формального параметра установлено в lvalue фактического параметра». и, если я правильно понимаю, то же определение используется здесь («Формальный параметр просто действует как псевдоним для фактического параметра.»)
Фактически, единственные места, которые я нашел, где используется более строгое определение, - это места, которые противоречат идее, что в Java объекты передаются по ссылке (это может быть связано с отсутствием у меня google-fu).
Итак, если я все понял, переход по ссылке
class Thing { ... }
void byReference(Thing object){ ... }
Thing something;
byReference(something);
согласно первому определению примерно соответствует (в С)
struct RawThing { ... };
typedef RawThing *Thing;
void byReference(Thing object){
// do something
}
// ...
struct RawThing whatever = blah();
Thing something = &whatever;
byReference(something); // pass whatever by reference
// we can change the value of what something (the reference to whatever) points to, but not
// where something points to
и в этом смысле достаточно сказать, что Java передает объекты по ссылке. Но согласно второму определению, передача по ссылке означает более или менее
struct RawThing { ... };
typedef RawThing *RawThingPtr;
typedef RawThingPtr *Thing;
void byReference(Thing object){
// do something
}
// ...
RawThing whatever = blah();
RawThingPtr thing_pointer = &whatever;
byReference(&thing_pointer); // pass whatever by reference
// now we can not only change the pointed-to (referred) value,
// but also where thing_pointer points to
И поскольку Java позволяет вам иметь только указатели на объекты (ограничивая то, что вы можете с ними делать), но не имеет указателей на указатели, в этом смысле говорить, что Java передает объекты по ссылке, совершенно неверно.
Итак,
- Правильно ли я понял приведенные выше определения передачи по ссылке?
- Существуют ли другие определения вокруг?
- Есть ли согласие, какое определение является "правильным", если да, то какое?