Java通过引用传递

del*_*ita 30 java terminology parameter-passing pass-by-reference pass-by-value

这2个代码有什么区别:

代码A:

Foo myFoo;
myFoo = createfoo();
Run Code Online (Sandbox Code Playgroud)

哪里

public Foo createFoo()
{
   Foo foo = new Foo();
   return foo;
}
Run Code Online (Sandbox Code Playgroud)

比.代码B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}
Run Code Online (Sandbox Code Playgroud)

这2个代码之间有什么区别吗?

Eng*_*uad 187

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");
     }
}
Run Code Online (Sandbox Code Playgroud)

我将逐步解释这个:

  1. 声明一个名为ftype 的引用,Foo并将其分配给Foo具有属性的新对象类型"f".

    Foo f = new Foo("f");
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

  2. 从方法方面,声明Foo了具有名称的类型的引用,a并且它最初被分配给null.

    public static void changeReference(Foo a)
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

  3. 在调用方法时changeReference,引用a将分配给作为参数传递的对象.

    changeReference(f);
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

  4. 声明一个名为btype 的引用,Foo并将其分配给Foo具有属性的新对象类型"b".

    Foo b = new Foo("b");
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

  5. a = b将引用aNOT 重新分配给f其属性所在的对象"b".

    在此输入图像描述


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

    在此输入图像描述

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

    在此输入图像描述

我希望你现在明白如何将对象作为参数传递在Java中:)


A.H*_*.H. 9

由于Java严格地"按值传递",甚至对值的引用都按值传递,因此第二个代码将无法按预期工作.请参阅右侧的"相关"部分,以便对此进行多次讨论.