首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

<通译>Does Java pass by reference or pass by value

2012-12-28 
翻译Does Java pass by reference or pass by value?E文地址:http://www.javaworld.com/javaworld/javaq

<翻译>Does Java pass by reference or pass by value?

E文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

?

Q:如果Java是传引用的,为什么swap方法不起作用?

A:你的问题说明了一个Java语言学习者共有的错误。确实,即使是有经验的老手也很难证明这是对的。

?

Java利用引用来操作对象,并且所有的对象属性都是引用。但是,Java关不利用引用来传递方法参数,而是利用值来传递。

?

请以下面的badSwap()方法为例子:

?

?如果我们执行这个main函数,我们会看到下面的输出:

?

图一.在被传递给一个方法后,一个对象至少会有两个引用

?

Java通过值来拷贝和传递引用,而非对象。因此,方法操作会修改对象,因为引用指向了原始的对象。但是因为在方法里的这个引用是拷贝的,交换操作会失败。如图二所示,方法引用虽然被交换了,但原始引用没有改变。不幸地,在一个方法调用结束后,留下给你的只有两个没有交换过的原始引用。如果想要成功地在方法调用外交换,我们需要交换原始引用,而非拷贝。

<通译>Does Java pass by reference or pass by value

图二.只有方法引用被交换了,而不是原始引用

?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

?

Java中的“引用”是指非原生类型的变量的保存的是对一个堆上对象的引用。?
Java任何时候都是传的,只不过该的语义有所不同罢了

?

所有的参数传递都是 传值,从来没有 传引用 这个事实。?
所有的参数传递都会在 程序运行栈上 新分配一个 值 的复制品.?

?

注:?
传引用,? 只有一种语法现象.?
就是 C++的一种语法?
void function(int & a){?
?? a = 1;?
}?

这个实际上编译为?
void function(int * a){?
?? *a = 1;?
}?

还是传的 地址值。

?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

参数传递的问题。?
这里涉及到的基本功常识为:?
1. 每个Thread有自己的 运行栈。Stack?

2. 每次函数调用,运行栈顶部上都会为 该函数调用 分配一个Stack Frame.? 这也称为Context.?

3. 函数调用结束,栈指针回到上一级函数调用的Context, Stack Frame, 刚才分配的顶部Stack Frame 就失效。上一级函数成为当前Stack Frame, Context。?

4. 每次函数调用, 参数都会?压栈?压入运行栈。注意,这是非常重要的。?

5. 压入运行栈内的 参数,是 Copy 了一份。注意,这也是非常重要的。所以,对参数 赋值,对上一级函数调用来说,是根本没有意义的。?
因为只是改变了顶部Stack Frame里面 参数Copy的内容,根本不对上一级 Stack Frame 造成任何影响。?

?

?

热点排行