那么谁有权决定呢?
编辑: 显然我没有成功地表达我的问题。
我不是在问Java的参数传递如何工作。我知道看起来像保存对象的变量实际上是保存对象的引用的变量,并且该引用是按值传递的。
这个机制已经在此处(链接的线程和其他地方)和其他地方有很好的解释。
问题是关于“按引用传递”这个术语的技术含义。(结束编辑)
我不确定这是否是适合SO的问题,如果不是,我很抱歉,但我不知道更好的地方。在其他问题中已经有很多讨论了,例如Is Java "pass-by-reference" or "pass-by-value"?和pass by reference or pass by value?,但我还没有找到一个权威的答案来回答这个问题。
我曾认为“按引用传递”意味着“传递对象的引用(通常是指针)”,因此被调用方可以修改调用方看到的对象,而“按值传递”则意味着复制对象,并让被调用方使用副本(明显的问题:如果对象包含引用,则需要进行深拷贝或浅拷贝)。当提到“按引用传递”时,有很多地方都会说这意味着仅仅传递引用,很多 地方 都 这样说, 虽然有些争议,但定义仍然如此。在这里。
一种参数传递模式,其中将实际参数的引用(或指针)传递到形式参数中;当被调用者需要形式参数时,它会解除引用指针以获取它。在this页面上,我发现“形式参数的lvalue设置为实际参数的lvalue。”,如果我理解正确,相同的定义也在here中使用(“形式参数仅充当实际参数的别名。”)。事实上,我发现唯一使用更强的定义的地方是反对Java中对象按引用传递的概念的地方(这可能是由于我的谷歌搜索能力不足)。所以,如果我理解正确,按引用传递
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通过引用传递对象是完全错误的。
所以,
- 我是否充分理解了上述有关按引用传递的定义?
- 还有其他定义吗?
- 是否有共识认为哪个定义是“正确的”,如果有,哪个是正确的?
ByRef
或C#的ref
一样传递任何引用。我想人们所说的“按引用传递”实际上是指“按值传递引用类型”。 - Ry-