Java总是按值传递参数,而不是按引用传递。在您的示例中,您仍然通过其值传递obj
,而不是引用本身。在您的方法changeName
中,您将另一个(本地)引用obj
分配给作为参数传递的同一对象。一旦您修改该引用,就会修改作为参数传递的原始引用obj
。
编辑:
让我通过一个例子来解释这个问题:
public class Main
{
public static void main(String[] args)
{
Foo f = new Foo("f");
changeReference(f);
modifyReference(f);
}
public static void changeReference(Foo a)
{
Foo b = new Foo("b");
a = b;
}
public static void modifyReference(Foo c)
{
c.setAttribute("c");
}
}
我将逐步解释这个问题:
1- 声明一个类型为
Foo
的引用变量
f
,并将其赋值为一个带有属性
"f"
的新的
Foo
对象。
Foo f = new Foo("f");
![在这里输入图片描述](https://istack.dev59.com/arXpP.webp)
2- 从方法的角度来看,声明了一个类型为Foo
、名为a
的引用,并将其初始值赋为null
。
public static void changeReference(Foo a)
![在此输入图片描述](https://istack.dev59.com/k2LBD.webp)
3- 当您调用方法changeReference
时,引用变量a
将被赋值为传递给该方法的对象。
changeReference(f);
![图片描述](https://istack.dev59.com/1Ez74.webp)
4- 声明一个名为b
的引用,类型为Foo
,并将其分配给具有属性"b"
的Foo
类型的新对象。
Foo b = new Foo("b");
![Enter image description here](https://istack.dev59.com/Krx4N.webp)
5- 当你使用 a = b
时,实际上是将引用 a
而不是 f
重新指向其属性为 "b"
的对象。
![Enter image description here](https://istack.dev59.com/rCluu.webp)
6- 当你调用 modifyReference(Foo c)
方法时,一个名为 c
的引用被创建并指向其属性为 "f"
的对象。
![Enter image description here](https://istack.dev59.com/PRZPg.webp)
7- c.setAttribute("c");
将会修改引用 c
所指向的对象的属性,而这个对象也是引用 f
指向的对象。
![Enter image description here](https://istack.dev59.com/H9Qsf.webp)
希望你现在明白了 Java 中如何传递对象作为参数 :)