当前位置:  开发笔记 > 编程语言 > 正文

Java是否通过引用传递?

如何解决《Java是否通过引用传递?》经验,为你挑选了3个好方法。

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

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



1> pgras..:

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

但是,对于非原始类型,值是引用的值.

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



2> Scott Stanch..:

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

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



3> joel.neely..:

区别在于“通过引用”和“通过引用”之间。有时您还会看到“通过...呼叫”和“通过...”交替使用。为了简单起见,我将坚持使用“ pass-by ...”。

    在与FORTRAN相关的学术,老式,comp-sci术语中,按引用传递意味着被调用的代码可以访问(引用)调用者传递的变量。在调用的代码中分配给形式参数实际上是对调用方的变量进行分配。区别在于传递值传递值之间的区别,传递值给被调用的代码提供了调用者已知的数据副本(无论它是什么)。

    在与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,该引用在该引用对象上称为mutating方法。(换句话说,a0收到了的值的副本,该副本是对l0已修改的字符串列表的引用。)

但是,从返回时munge,调用者的第二个列表l1仍包含,"world"因为在传递的对象引用(的值l1通过值传递munge)上没有调用任何方法。相反,参数变量a1被设置为新值(本地对象引用也保存在中foo)。

如果 Java使用过按引用传递,则返回时l1将包含它,"everybody"因为a1它将引用该变量, l1而不是被简单地初始化为其值的副本。因此,对的分配也a1将是对的分配l1

在另一个问题中讨论了相同的问题,使用ASCII艺术来说明这种情况。

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有