Java是通过引用传递的吗?

Java真的支持通过引用传递吗?

如果没有,为什么我们有==运算符来查找具有相同引用的两个对象?

Java使用pass by value,而不是引用…

但是,对于非基本类型,值是引用的值。

所以==比较对象的引用值。

有关详细说明,请参阅我的文章“Java is Pass-By-Value,Dammit!”

http://javadude.com/articles/passbyvalue.htm

区别在于“传递** – 参考”和“传递 **参考”。 您有时也会看到“call-by -…”和“pass-by -…”可以互换使用。 为简单起见,我会坚持使用“pass-by -…”。

  1. 在学术,旧学校,FORTRAN相关,comp-sci术语中, 传递引用意味着被调用代码可以访问(引用)调用者传递的变量。 分配给被调用代码中的forms参数实际上是对调用者变量的赋值。 区别在于(以及其他) pass-by-value ,它为被调用代码提供调用者已知的数据副本(无论它是什么)。

  2. 在当代与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中的参数传递