谁有权决定?
编辑:显然我没有成功地制定好我的问题.
我不是问Java的参数传递是如何工作的.我知道看起来像一个持有对象的变量实际上是一个包含对象的引用的变量,该引用是通过值传递的.
在这里(在链接的线程和其他)以及其他地方,有很多关于该机制的精细解释.
问题是关于术语“通过参考”的技术含义. (完成编辑)
我不知道这是否是SO的正确的问题,如果不是,道歉,但我不知道一个更好的地方.在其他问题上已经有很多话已经说过了,例如Is Java pass by reference?和pass by reference or pass by value?,但是我没有在这个问题上找到一个权威性的答案.
我认为“通过引用”是指“通过一个引用(通常是一个指针)到对象”,所以被调用者可以修改调用者看到的对象,而“通过值”意味着复制对象,并让被叫方有复制的乐趣(明显的问题:如果对象包含引用,深层复制或浅色).
唱FW开始lots of places saying“通过引用”意思就是这样,here有一些说法意味着更多,但是定义仍然读
A ParameterPassing mode where a reference (or if you want to be politically incorrect, a pointer) to the actual parameter is passed into the formal parameter; when the callee needs the formal parameter it dereferences the pointer to get it.
我没有找到很多地方给出更强的定义,在this页,我发现“形式参数的左值设置为实际参数的左值”.并且如果我理解正确,则使用相同的定义here(“形式参数仅仅作为实际参数的别名”.)
事实上,唯一发现使用更强的定义的地方是反对在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通过引用传递对象是完全错误的.
所以,
>我是否充分了解上述传递参考的定义?
>周围有其他定义吗?
>有共识哪个定义是“正确的”,如果是,哪个?