Java是否通过引用传递?

这个问题在这里已经有了答案:

  • Java是“通过引用传递”还是“按值传递”? 78个答案

  • Java使用按值传递,而不是引用...

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

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


    有关详细的解释,请参阅我的文章“Java是按值传递,该死!”

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


    区别之处在于“通过引用 ** ”和“传递 **引用”之间。 您有时也会看到“通过......呼叫”和“通过......”交替使用。 为了简单起见,我会坚持“传递......”。

  • 在学术,老派,FORTRAN相关的comp-sci术语中,传递引用意味着被调用的代码可以访问(引用)调用者传递的变量。 分配给被调用代码中的形式参数实际上是对调用者的变量赋值。 区别在于(除其他外)传递值,它为被调用的代码提供了调用者已知的数据副本(不管它是什么)。

  • 在当代与Java相关的面向对象的世界中,“对对象有一个引用”意味着能够到达对象本身。 这与“有一个指针”的区别在于强调(除其他事项外):对参考不做“指针算术”。 (实际上,这个意义上的“引用”不一定必须是实际的指针状内存地址。)

  • Java通过值传递参数(在第一种意义上),但对于对象参数,该值是引用(在第二种意义上)。 以下是一些依赖差异的代码。

    // called
    public void munge(List<String> a0, List<String> a1) {
        List<String> foo = new List<String>(); foo.add("everybody");
        a0.set(0, "Goodbye");
        a1 = foo;
    }
    
    // caller
    ...
    List<String> l0 = new List<String>(); l0.add("Hello");
    List<String> l1 = new List<String>(); l1.add("world");
    munge(l0, l1);
    ...
    

    munge返回时,来电者的第一个列表l0将包含"Goodbye" 。 对该列表的引用被传递给了munge ,它在该引用的对象上调用了一种变异方法。 (换句话说, a0收到了一个l0的值的副本,它是一个被修改的字符串列表的引用。)

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

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

    另一个问题讨论了同样的问题,用ASCII-art来说明情况。

    链接地址: http://www.djcxy.com/p/3507.html

    上一篇: Does Java pass by reference?

    下一篇: Why is an ArrayList parameter modified, but not a String parameter?