Java 通过引用传递

这2个代码有什么区别:

代码 A:

Foo myFoo;
myFoo = createfoo();

哪里

public Foo createFoo()
{
   Foo foo = new Foo();
   return foo;
}

与代码 B 相比:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}

这两条代码之间有什么区别吗?


答案 1

Java 总是按值而不是通过引用传递参数。


让我通过一个例子来解释这一点:

public class Main
{
     public static void main(String[] args)
     {
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a)
     {
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c)
     {
          c.setAttribute("c");
     }
}

我将分步骤解释这一点:

  1. 声明名为 type 的引用,并将其分配给具有属性 的新类型对象。fFooFoo"f"

    Foo f = new Foo("f");
    

    在此输入图像描述

  2. 从方法端,声明具有名称类型的引用,并将其最初分配给 。Fooanull

    public static void changeReference(Foo a)
    

    在此输入图像描述

  3. 当您调用该方法时,引用将被分配给作为参数传递的对象。changeReferencea

    changeReference(f);
    

    在此输入图像描述

  4. 声明名为 type 的引用,并将其分配给具有属性 的新类型对象。bFooFoo"b"

    Foo b = new Foo("b");
    

    在此输入图像描述

  5. a = b将引用 NOT 重新分配给其属性为 的对象。af"b"

    在此输入图像描述


  6. 调用方法时,将创建一个引用并将其分配给具有属性 的对象。modifyReference(Foo c)c"f"

    在此输入图像描述

  7. c.setAttribute("c");将更改引用指向它的对象的属性,并且该对象与引用指向它的对象相同。cf

    在此输入图像描述

我希望您现在了解将对象作为参数传递在Java中的工作原理:)


答案 2

由于Java是严格“按值传递”的,甚至对对象的引用也是按值传递的,因此第二个代码将无法按预期工作。请参阅右侧的“相关”部分,了解这方面的大量讨论。