Hey friends!
pass by value means the actual value is passed on by creating a copy of it.
Pass by reference means that a number (called a memory address) is passed on, this address defines where the actual value is stored.
I will try to explain why java is pass by value by taking an example class Person
.
public class Person {
private String name;
private int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Through out this post I will modify the person
object in different scenarios and explain whats happening behind the scenes.
Initial state: Let’s create a person
object with name
`Tom Cruise` and age
57.
public class ReferenceTest {public static void main(String[] args) { Person person = new Person("Tom Cruise", 57); System.out.println(person.getName()); }} Output: Tom Cruise
Scenario 1:
Now let’s try to change the name
of the person
object.
Person person = new Person("Tom Cruise", 57); modifyPerson(person); System.out.println(person.getName()); private static void modifyPerson(Person person) { person.setName("Brad Pitt"); } Output: Brad Pitt
No surprises.
Scenario 2:
Let’s now modify the state
of person
. I will try to nullify the object.
//excluded other code for brevity private static void modifyPerson(Person person2) { person2 = null; } Output: Tom Cruise
What ? Yes that’s because java passes a copy of reference (don’t get confused this with physical memory address reference)pointing to the actual object. So what ever you do to change the state of the reference the actual object remains untouched. The image will explain more. person
is untouched as person2
is a reference copy of person
.
Let’s do one last thing to confirm this.
//excluded other code for brevity private static void modifyPerson(Person person2) { person2 = new Person("Johnny Depp", 56); } Output: Tom Cruise
Still no change. Look at the image to see whats happening.
person2
is pointing to a whole new object in the memory.
Same thing applies to primitive data types.
Last but not the least you can pass the reference of a variable by adding an &
in front of the method argument, but we can just return
the value instead of doing this.
Hope this helps!