Java是否真的按值传递对象?
可能重复:是否通过引用传递Java?
public class myClass{
public static void main(String[] args){
myObject obj = new myObject("myName");
changeName(obj);
System.out.print(obj.getName()); // This prints "anotherName"
}
public static void changeName(myObject obj){
obj.setName("anotherName");
}
}
我知道Java按值传递,但为什么它在前面的示例中通过引用传递obj
并进行更改?
Java总是通过值传递参数,而不是通过引用。 在你的例子中,你仍然通过它的值传递obj
,而不是参考本身。 在您的方法changeName
,您将另一个(本地)引用obj
分配给您将其作为参数传递给它的同一对象。 一旦您修改了该引用,即修改了作为参数传递的原始引用obj
。
编辑:
让我通过一个例子来解释这一点:
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 change the object that the reference 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-声明一个名为f
的Foo
类型的引用,并将其赋值给一个具有属性"f"
Foo
类型的新对象。
Foo f = new Foo("f");
2-在方法方面,声明一个名为a
的类型为Foo
的引用,并且它最初分配给null
。
public static void changeReference(Foo a)
3-当您调用changeReference
方法changeReference
,引用a
将被分配给作为参数传递的对象。
changeReference(f);
4-声明一个名为b
的Foo
类型的引用,并将其赋值给一个具有属性"b"
Foo
类型的新对象。
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中,对象句柄或对象的标识被认为是一个值。 按值传递意味着传递该句柄,而不是该对象的完整副本。
术语“通过参考”中的“参考”也并不意味着“参考对象”。 它的意思是“引用一个变量” - 一个名为“桶”的函数定义(或者说,一个调用框架)可以存储一个值。
通过引用传递意味着被调用的方法可以更改调用方法中的变量值。 (例如,在C标准库中,函数scanf
这种方式工作。)这在Java中不可行。 您始终可以更改对象的属性 - 它们不被视为其“值”的一部分。 它们是完全不同的独立对象。
你正在改变obj
的属性,而不是改变obj
(参数)本身。
重点是,如果你指出obj
在changeName
中的其他地方,那个改变将不会反映在main
。
看到这个职位进一步澄清。
链接地址: http://www.djcxy.com/p/3501.html