Java通过引用传递

这两个代码有什么区别:

代码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; } 

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

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. 声明名为fFoo类型的引用,并将其分配给类型为Foo的新对象,其属性为"f"

     Foo f = new Foo("f"); 

    在此处输入图像描述

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

     public static void changeReference(Foo a) 

    在此处输入图像描述

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

     changeReference(f); 

    在此处输入图像描述

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

     Foo b = new Foo("b"); 

    在此处输入图像描述

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

    在此处输入图像描述


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

    在此处输入图像描述

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

    在此处输入图像描述

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

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

将方法参数视为自己的变量声明 。 如果您使用单个代码块替换方法调用,它看起来像这样:

 Foo myFoo; { //Method call starts here Foo foo; foo = myFoo; Foo f = new Foo(); foo = f; } //Method call ends here 

即使方法参数与另一个变量具有相同的名称,方法参数仍然是它自己的唯一引用,只有方法知道。 这与Eng.Fouad上面说的相同。

您应该知道的另一个重点是您传递给方法的对象类型。 它是一个可变对象还是一个不可变对象。 如果传递一个不可变对象(如String),它将创建另一个副本并进行修改。 更改不会反映到您的原始副本。