Java pass by value explained

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!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.