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"); } }
我将逐步解释这个:
-
声明名为
f
的Foo
类型的引用,并将其分配给类型为Foo
的新对象,其属性为"f"
。Foo f = new Foo("f");
-
从方法方面,声明了具有名称
a
的类型为Foo
的引用,并且它最初被赋值为null
。public static void changeReference(Foo a)
-
当您调用方法
changeReference
,引用a
将被分配给作为参数传递的对象。changeReference(f);
-
声明名为
b
的类型为Foo
的引用,并将其分配给类型为Foo
的新对象,其属性为"b"
。Foo b = new Foo("b");
-
a = b
将引用a
NOTf
重新分配给其属性为"b"
的对象。
-
当您调用
modifyReference(Foo c)
方法时,将创建引用c
并将其分配给具有属性"f"
的对象。 -
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),它将创建另一个副本并进行修改。 更改不会反映到您的原始副本。