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 并更改它?
Possible Duplicate:
Is Java pass by reference?
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");
}
}
I know that Java pass by value, but why does it pass obj
by reference in previous example and change it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
Java 总是按值传递参数,而不是按引用传递参数。在您的示例中,您仍然通过其值传递 obj,而不是引用本身。在您的方法
changeName
中,您将另一个(本地)引用obj
分配给您作为参数传递的同一对象。修改该引用后,您也就修改了作为参数传递的原始引用obj
。编辑:
让我通过一个例子来解释这一点:
我将分步骤解释这一点:
1-声明一个名为
f
类型为Foo
的引用并分配它是一个带有属性"f"
的Foo
类型的新对象。2- 从方法端,带有名称的
Foo
类型的引用a
已声明,并且最初分配给null
。3- 当您调用方法
changeReference
时,引用a
将被分配给作为参数传递的对象。4- 声明一个名为
b
的引用,其类型为Foo 并将其分配给具有属性
"b"
的Foo
类型的新对象。5-
a = b
正在重新分配引用a
NOTf
到其属性为"b"
的对象。6- 当您调用
modifyReference(Foo c)
方法时,引用 <创建 code>c 并将其分配给具有属性"f"
的对象。7-
c.setAttribute("c");
将更改属性引用c
指向它的对象,与引用f
指向它的对象是同一个对象。我希望您现在了解在 Java 中如何将对象作为参数传递:)
Java always passes arguments by value, NOT by reference. In your example, you are still passing
obj
by its value, not the reference itself. Inside your methodchangeName
, you are assigning another (local) reference,obj
, to the same object you passed it as an argument. Once you modify that reference, you are modifying the original reference,obj
, which is passed as an argument.EDIT:
Let me explain this through an example:
I will explain this in steps:
1- Declaring a reference named
f
of typeFoo
and assign it to a new object of typeFoo
with an attribute"f"
.2- From the method side, a reference of type
Foo
with a namea
is declared and it's initially assigned tonull
.3- As you call the method
changeReference
, the referencea
will be assigned to the object which is passed as an argument.4- Declaring a reference named
b
of typeFoo
and assign it to a new object of typeFoo
with an attribute"b"
.5-
a = b
is re-assigning the referencea
NOTf
to the object whose its attribute is"b"
.6- As you call
modifyReference(Foo c)
method, a referencec
is created and assigned to the object with attribute"f"
.7-
c.setAttribute("c");
will change the attribute of the object that referencec
points to it, and it's same object that referencef
points to it.I hope you understand now how passing objects as arguments works in Java :)
在 Java 中,对象句柄或对象的标识被视为一个值。按值传递意味着传递此句柄,而不是对象的完整副本。
术语“按引用传递”中的“引用”也不意味着“对对象的引用”。它的意思是“对变量的引用”——函数定义(或者更确切地说,调用框架)中可以存储值的命名“存储桶”。
通过引用传递意味着被调用的方法可以更改调用方法中的变量值。 (例如,在 C 标准库中,函数
scanf
就是这样工作的。)这在 Java 中是不可能的。您始终可以更改对象的属性 - 它们不被视为其“值”的一部分。它们是完全不同的独立对象。In Java, an object handle, or the identity of an object is considered a value. Passing by value means passing this handle, not a full copy of the object.
A "reference" in the term "pass by reference" also doesn't mean "reference to an object". It means "reference to a variable" – a named "bucket" in a function definition (or, rather, a call frame) that can store a value.
Passing by reference would mean the called method could change variable values in the calling method. (For example, in the C standard library, the function
scanf
works this way.) This isn't possible in Java. You can always change the properties of an object – they aren't considered a part of its "value". They're completely different independent objects.它没有改变 obj (你的代码无论如何也不会改变它)。
如果它是通过引用传递的,您可以编写:
并通过 main 方法打印“anotherName”。
It did not change obj (your code doesn't change it anyway).
Had it been passed by reference, you could have written:
And have "anotherName" printed by the main method.
您正在更改
obj
的属性,而不是更改obj
(参数)本身。关键是,如果您将
obj
指向changeName
中的其他内容,则 更改将不会反映在main
中。有关进一步说明,请参阅这篇文章。
You're changing a property of
obj
, not changingobj
(the parameter) itself.The point is that if you pointed
obj
at something else inchangeName
that that change would not be reflected inmain
.See this post for further clarification.
它将对 obj 的引用作为值传递(我知道有点令人困惑:))。
假设它复制了指向 obj 值的指针并传递它。
这意味着您可以执行以下操作:
并且该语句
仍将引用旧对象(您执行 setName 的对象)。
It is passing the reference to obj as a value (a bit confusing I know :)).
So let's say it makes a copy of the pointer to obj's value and pass that.
That means that you can do things like:
and the statement
is still going to refer to the old object (the one that you did setName).
Java 正在传递您要传递给函数的内容的副本。当它是原始类型时 - 它将是值的副本。当它是一个对象时 - 您正在传递参考副本。在您的代码示例中,您正在修改对象属性之一,但不是引用本身,因此名称将被更改。但是,当您想在 ChangeName 函数中将新对象分配给 obj 变量时,您将更改引用,因此外部 obj 将具有旧值。
Java is passing a copy of what you're passing to your function. When it is a primitive type - it will be the copy of a value. When it is an object - you're passing the reference copy. In you're code example you're modifying one of objects properties, but not the reference itself so the name will be changed. However when you'd like to assign new object to obj variable in changeName function, then you're changing reference, so outside obj will have an old value.