Java真的支持通过引用传递吗?
如果没有,为什么我们有==运算符来查找具有相同引用的两个对象?
Java使用pass by value,而不是引用...
但是,对于非原始类型,值是引用的值.
所以==比较对象的引用值.
有关详细说明,请参阅我的文章"Java is Pass-By-Value,Dammit!"
http://javadude.com/articles/passbyvalue.htm
区别在于“通过引用”和“通过引用”之间。有时您还会看到“通过...呼叫”和“通过...”交替使用。为了简单起见,我将坚持使用“ pass-by ...”。
在与FORTRAN相关的学术,老式,comp-sci术语中,按引用传递意味着被调用的代码可以访问(引用)调用者传递的变量。在调用的代码中分配给形式参数实际上是对调用方的变量进行分配。区别在于传递值与传递值之间的区别,传递值给被调用的代码提供了调用者已知的数据副本(无论它是什么)。
在与Java有关的当代OO世界中,“拥有对对象的引用”意味着能够到达对象本身。这不同于“具有指针”以强调(除其他事项外)对参考不执行“指针算术”。(实际上,这种意义上的“引用”不必一定是实际的类似指针的内存地址。)
Java通过值传递参数(从第二个意义上来说),但是对于对象参数,该值是一个引用(在第二个意义上)。这是一些依赖于差异的代码。
// called public void munge(Lista0, List a1) { List foo = new List (); foo.add("everybody"); a0.set(0, "Goodbye"); a1 = foo; } // caller ... List l0 = new List (); l0.add("Hello"); List l1 = new List (); l1.add("world"); munge(l0, l1); ...
从返回时munge
,呼叫者的第一个列表l0
将包含"Goodbye"
。对该列表的引用传递给munge
,该引用在该引用对象上称为mutating方法。(换句话说,a0
收到了的值的副本,该副本是对l0
已修改的字符串列表的引用。)
但是,从返回时munge
,调用者的第二个列表l1
仍包含,"world"
因为在传递的对象引用(的值l1
,通过值传递到munge
)上没有调用任何方法。相反,参数变量a1
被设置为新值(本地对象引用也保存在中foo
)。
如果 Java使用过按引用传递,则返回时l1
将包含它,"everybody"
因为a1
它将引用该变量, l1
而不是被简单地初始化为其值的副本。因此,对的分配也a1
将是对的分配l1
。
在另一个问题中讨论了相同的问题,使用ASCII艺术来说明这种情况。