Java pass by reference
Java always passes arguments by value NOT by reference.
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 modify the object that the reference variable "f" 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:
Declaring a reference named
f
of typeFoo
and assign it to a new object of typeFoo
with an attribute"f"
.Foo f = new Foo("f");
From the method side, a reference of type
Foo
with a namea
is declared and it's initially assigned tonull
.public static void changeReference(Foo a)
As you call the method
changeReference
, the referencea
will be assigned to the object which is passed as an argument.changeReference(f);
Declaring a reference named
b
of typeFoo
and assign it to a new object of typeFoo
with an attribute"b"
.Foo b = new Foo("b");
a = b
is re-assigning the referencea
NOTf
to the object whose its attribute is"b"
.As you call
modifyReference(Foo c)
method, a referencec
is created and assigned to the object with attribute"f"
.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 :)
Since Java is strictly "pass by value" and even references to objects are passed by value the second code will not work as expected. See the "Related" section to the right for numerous discussions on this.