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?
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.
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.
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.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.
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 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 :)