这两个代码的区别是什么:
代码A:
Foo myFoo;
myFoo = createfoo();哪里
public Foo createFoo()
{
Foo foo = new Foo();
return foo;
}Vs.代码B:
Foo myFoo;
createFoo(myFoo);
public void createFoo(Foo foo)
{
Foo f = new Foo();
foo = f;
}这两段代码有什么不同吗?
发布于 2012-02-23 07:11:57
Java总是通过值传递参数,而不是通过引用。
让我通过example来解释这一点
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类型的引用,并将其分配给一个具有"f"属性的Foo类型的新对象。Foo f= new Foo("f");

Foo的引用,并将其命名为a,并将其初始分配给null。static void changeReference(Foo a) (公共静态无效设置(Foo A)公共静态无效设置

changeReference时,引用a将被分配给作为参数传递的对象。changeReference(f);

b的Foo类型的引用,并将其分配给一个具有"b"属性的Foo类型的新对象。Foo b=新Foo("b");

a = b正在为其属性为"b".的对象重新分配引用a而不是f

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

c.setAttribute("c");将更改引用c指向它的对象的属性,而引用f指向它的对象也是这个对象。
我希望您现在了解如何在Java中将对象作为参数进行传递:)
发布于 2012-02-23 07:06:18
由于Java是严格的“按值传递”,甚至对对象的引用也是按值传递的,因此第二个代码将无法按预期工作。请参阅右侧的“相关”部分,了解有关这方面的大量讨论。
发布于 2012-02-23 08:05:56
将方法参数看作是它们自己的变量声明。如果将方法调用替换为单个代码块,则如下所示:
Foo myFoo;
{ //Method call starts here
Foo foo;
foo = myFoo;
Foo f = new Foo();
foo = f;
} //Method call ends here即使该方法参数与另一个变量具有相同的名称,该方法参数仍然是它自己的唯一引用,只有该方法知道。这和Eng.Fouad上面说的是一样的。
https://stackoverflow.com/questions/9404625
复制相似问题