Что именно означает «пройти по ссылке»?

И кто имеет право решать?

Редактировать: По-видимому, мне не удалось правильно сформулировать свой вопрос.
Я не спрашиваю, как работает передача аргументов в Java. Я знаю, что то, что выглядит как переменная, содержащая объект, на самом деле является переменной, содержащей ссылку на объект, и эта ссылка передается по значению. Здесь есть множество прекрасных объяснений этого механизма (в связанных потоках и другие) и в других местах.

Вопрос касается технического значения термина передача по ссылке. (Конец редактирования)

Я не уверен, что это правильный вопрос для SO, извиняюсь, если нет, но я не знаю лучшего места. Здесь уже многое было сказано в других вопросах, например Является ли Java «передачей по ссылке» или «передачей по значению»? и передаются по ссылке или передаются по значению? , но я не нашел авторитетного ответа на вопрос, что означает этот термин.

Я думал, что «передать по ссылке» означает «передать ссылку (обычно указатель) на объект», поэтому вызываемый может изменить объект, который видит вызывающий, в то время как «передать по значению» означает копирование объекта и позволяя вызываемому развлечься с копией (очевидная проблема: что, если объект содержит ссылки, глубокую копию или мелкую).
Sing the FW появляется много из мест , говоря «пройти по ссылке», значит, здесь есть некоторые аргумент, что это означает больше, но определение по-прежнему читает

Режим ParameterPassing, в котором ссылка (или, если вы хотите быть политически некорректным, указатель) на фактический параметр передается в формальный параметр; когда вызываемому объекту нужен формальный параметр, он разыменовывает указатель, чтобы получить его.

Я не нашел много мест, дающих более сильное определение этого термина, на этой странице я обнаружил, что «lvalue формального параметра устанавливается равным lvalue фактического параметра». и, если я правильно понимаю, то же определение используется здесь («Формальный параметр просто действует как псевдоним для фактического параметра».)

Фактически, единственные места, которые я нашел, где сильнее Определение используется в местах, где аргументируется идея о том, что в Java объекты передаются по ссылке (это может быть связано с отсутствием у меня google-fu).

Итак, если бы я все понял, передача по ссылке

class Thing { ... }
void byReference(Thing object){ ... }
Thing something;
byReference(something);

в соответствии с первым определением примерно соответствовала бы (в C)

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 передает объекты по ссылке.

Итак,

  1. Достаточно ли я понял приведенные выше определения передачи по ссылке?
  2. Есть ли другие определения?
  3. Есть ли консенсус, какое определение является «правильным», если да, то какое ?

15
задан Community 23 May 2017 в 11:51
поделиться