И кто имеет право решать?
Изменить: По-видимому, мне не удалось хорошо сформулировать мой вопрос.
Я не спрашиваю, как работает передача аргументов Java. Я знаю, что то, что выглядит как переменная, удерживающая объект, на самом деле является переменной, содержащей ссылку на объект, и эта ссылка передается по значению.
Здесь есть много тонких объяснений этого механизма (в связанных потоках и других) и в других местах.
Вопрос о техническом значении термина pass-by-reference. (Редактирование конца)
Я не уверен, что это правильный вопрос для SO, извините, если нет, но я не знаю лучшего места. Многое уже было сказано в других вопросах здесь, например Является ли Java "pass-by-reference " или" pass-by-value "? и передавать по ссылке или передавать по значению?, но я не нашел авторитетного ответа на вопрос что означает этот термин.
Я подумал, что "передать по ссылке" означает "передать ссылку (обычно указатель) на объект", поэтому вызывающий может изменить объект, который видит вызывающий, а "передать по значению" означает копирование объекта и позволяя вызываемому веселиться с копией (очевидная проблема: что, если объект содержит ссылки, глубокие копии или мелкие).
Sing the FW появляется lots места say "pass by reference" означает именно это, здесь есть некоторые аргументы, что это означает больше, но определение все еще читает
Режим ParameterPassing, когда ссылка (или если вы хотите быть политически неправильной, указатель) к фактическому параметру передается в формальный параметр; когда вызываемому требуется формальный параметр, он разыскивает указатель, чтобы получить его.
Я не нашел много мест, дающих более четкое определение термина, на этой странице, я обнаружил, что "значение официальной параметр установлен на значение l фактического параметра." и, если я правильно понимаю, это же определение используется здесь ( "Формальный параметр просто действует как псевдоним для фактического параметра" ).
Фактически, единственные места, где я нашел, где используется более сильное определение, являются местами, противоречащими понятию, что в 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 передает объекты по ссылке, будет адекватным. Но, согласно второму определению, pass-by-reference означает более или менее
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 передает объекты по ссылке полностью неверно.
Итак,
- Я правильно понял приведенные выше определения pass-by-reference?
- Существуют ли другие определения?
- Существует ли консенсус, какое определение является "правильным", если да, то какое?