Is Java really passing objects by value? [duplicate]
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?
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 method changeName
, 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:
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");
}
}
I will explain this in steps:
1- Declaring a reference named f
of type Foo
and assign it to a new object of type Foo
with an attribute "f"
.
Foo f = new Foo("f");
2- From the method side, a reference of type Foo
with a name a
is declared and it's initially assigned to null
.
public static void changeReference(Foo a)
3- As you call the method changeReference
, the reference a
will be assigned to the object which is passed as an argument.
changeReference(f);
4- Declaring a reference named b
of type Foo
and assign it to a new object of type Foo
with an attribute "b"
.
Foo b = new Foo("b");
5- a = b
is re-assigning the reference a
NOT f
to the object whose its attribute is "b"
.
6- As you call modifyReference(Foo c)
method, a reference c
is created and assigned to the object with attribute "f"
.
7- c.setAttribute("c");
will change the attribute of the object that reference c
points to it, and it's same object that reference f
points to it.
I hope you understand now how passing objects as arguments works in 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.
It did not change obj (your code doesn't change it anyway). Had it been passed by reference, you could have written:
public static void changeName(myObject obj){
obj = new myObject("anotherName");
}
And have "anotherName" printed by the main method.
You're changing a property of obj
, not changing obj
(the parameter) itself.
The point is that if you pointed obj
at something else in changeName
that that change would not be reflected in main
.
See this post for further clarification.