Java是通过引用传递的吗?
Java真的支持通过引用传递吗?
如果没有,为什么我们有==运算符来查找具有相同引用的两个对象?
Java使用pass by value,而不是引用…
但是,对于非基本类型,值是引用的值。
所以==比较对象的引用值。
有关详细说明,请参阅我的文章“Java is Pass-By-Value,Dammit!”
区别在于“传递** – 参考”和“传递 **参考”。 您有时也会看到“call-by -…”和“pass-by -…”可以互换使用。 为简单起见,我会坚持使用“pass-by -…”。
-
在学术,旧学校,FORTRAN相关,comp-sci术语中, 传递引用意味着被调用代码可以访问(引用)调用者传递的变量。 分配给被调用代码中的forms参数实际上是对调用者变量的赋值。 区别在于(以及其他) pass-by-value ,它为被调用代码提供调用者已知的数据副本(无论它是什么)。
-
在当代与Java相关的OO世界中,“对对象有一个引用”意味着能够到达对象本身。 这与“有一个指针”的区别在于强调(除此之外)一个人不在引用上做“指针算术”。 (事实上,在这个意义上的“引用”并不一定是实际的指针式内存地址。)
Java按值传递参数(在第一种意义上),但对于对象参数,值是引用(在第二种意义上)。 这里有一些依赖于差异的代码。
// called public void munge(List a0, 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
,后者在该引用对象上调用了一个变异方法。 (换句话说, a0
收到了l0
值的副本 ,它是对已修改的字符串列表的引用 。)
但是,从munge
返回时,调用者的第二个列表l1
仍然包含"world"
因为没有方法在传递的对象引用上调用( l1
的值, 通过值传递给munge
)。 相反,参数变量a1
被设置为一个新值(本地对象引用也保存在foo
)。
如果 Java使用了pass-by-reference,那么在返回时, l1
将包含"everybody"
因为a1
将引用变量 l1
而不是简单地初始化为其值的副本。 因此,对a1
的赋值也将是对l1
的赋值。
在另一个问题中讨论了同样的问题,用ASCII-art来说明情况。
Java 不使用pass-by-reference,而是使用pass-by-value。 原始值参数被复制到堆栈,以及指向对象的指针。
==
运算符应该用于比较原始值和比较对象引用。
简短的回答是否定的。 在Java中,只有pass-by-value,当你使用对象时(例如Object obj = new Object();
),你正在使用对象引用。 哪个得到了价值。
有关详细信息,请参阅: Java中的参数传递