И кто имеет право решать?
Редактировать: По-видимому, мне не удалось правильно сформулировать свой вопрос.
Я не спрашиваю, как работает передача аргументов в 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 передает объекты по ссылке.
Итак,