Many Java programmers question whether Java is pass by value or pass by reference. This article summarizes why Java is always pass by value.
First, what does pass by value and pass by reference mean?
Often, the confusion around these terms is a result of the concept of the object reference in Java. Technically, Java is always pass by value, because even though a variable might hold a reference to an object, that object reference is a value that represents the object’s location in memory. Object references are therefore passed by value.
Both reference data types and primitive data types are passed by value. Learn more about data types in Java.
In addition to understanding data types, it’s also important to understand memory allocation in Java, because reference data types and primitive data types are stored differently.
The following example demonstrates how values are passed in Java.
The example program uses the following class:
The following example program uses a generic method, swap()
, that swaps two variables. Another method, changeValue()
, attempts to change the variable values.
When you execute the example program, you get the following output:
OutputAfter the swap method executes:
'red' color value = Red
'blue' color value = Blue
After the changeValue method executes:
'blue' color value = Red
The output shows that the swap()
method didn’t swap the color values of the original objects. This helps to show that Java is pass by value, since the swap()
method only acts upon copies of the original object reference values.
This swap()
method test can be used with any programming language to check whether it’s pass by value or pass by reference.
swap()
Method ExplainedWhen you use the new
operator to create an instance of a class, the object is created and the variable contains the location in memory where the object is saved.
Here’s a step-by-step breakdown of what happens when the swap()
method executes:
Assume that red
is pointing to memory location 50 and blue
is pointing to memory location 100, and that these are the memory locations of both Balloon
objects.
When the class calls the swap()
method with the red
and blue
variables as arguments, two new object variables, o1
and o2
, are created. o1
and o2
also point to memory locations 50 and 100 respectively.
The following code snippet explains what happens within the swap()
method:
The values of o1
and o2
are swapped, but because the values are copies of the red
and blue
memory locations, there is no change to the values of the red
and blue
color values.
Since the variables contain the reference to the objects, it’s a common mistake to assume that you’re passing the reference and Java is pass by reference. However, you’re passing a value which is a copy of the reference and therefore it’s pass by value.
changeValue()
Method ExplainedThe next method in the example program changes the color value of the object referenced by the blue
variable:
Here’s a step-by-step breakdown of what happens within the changeValue()
method:
The class calls the changeValue()
method on the blue
variable that references memory location 100. The first line creates a reference that also points to memory location 100. The color value of the object at memory location 100 is changed to "Red"
.
The second line creates a new object (with color value "Green"
). The new object is at memory location 200. Any further methods executed on the balloon
variable act upon the object at memory location 200, and don’t affect the object at memory location 100. The new balloon
variable overwrites the reference created in line 1 and the balloon
reference from line 1 is no longer accessible within this method.
The third line changes the color value of the new Balloon
object at memory location 200 to "Blue"
, but does not affect the original object referenced by blue
at memory location 100. This explains why the final line of the example program output prints blue color value = Red
, which reflects the change from line 1.
In this article you learned about why Java is pass by value. Continue your learning with more Java tutorials.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
hai This is vijay here u are having a very good interview questions which are very helpfull during interview. i have been asked one qus in gtt is that : purpose of class inside interface with example. i saw lot of blogs but doesnt get clearity…so plz post the answer for this qus also. Thx in advance.
- vijay sakhare
So, if it is not by reference, so can you please explain the program as below : public class Test { public static void main(String[] args) { Employee emp1 = new Employee(“Employee 1”); System.out.println("Call for Emp1 " + emp1); nameChange(emp1); System.out.println(“Name change DONE”); System.out.println("Call for Emp1 " + emp1); } public static void nameChange(Employee e1){ e1.setName(“Employee 3”); } } class Employee { String name; Employee(String nam){ this.name = nam; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Object for "+ this.name; } } Becouse it is producing the output as Call for Emp1 Object for Employee 1 Name change DONE Call for Emp1 Object for Employee 3
- Atul
Again I would suggest read the full post, especially foo() method explanation for this.
- Pankaj
Hi, public class Test { public static void main(String[] args) { Balloon blue = new Balloon(“Blue”); foo(blue); System.out.println(blue.getColor()); } private static void foo(Balloon balloon) { balloon.setColor(“Red”); } } The output of the above program is Red. So, the above isn’t pass by reference ?
- Praveen
Think of it like two strings attached to a single balloon, the original one “blue” and at the time of invoking foo(), another one named “balloon”. Now if you will pull any of these, the balloon will be pulled towards you but as soon as you attached the “balloon” string to another balloon object, any further changes will not be done to the original object. This is “Pass by Value” and we are passing COPY of the reference.
- Pankaj
I am still confused. It seems java supports both pass by value and reference. In swap case it is pass by value. foo method in my previous comment acts as reference.
- Praveen
You got it all wrong man. You used strings in the above example, try using StringBuilder or StringBuffer, and see what you get.
- Anonymous
I don’t know what you meant, can you comment with sample code?
- Pankaj
Hope below code might explain why its pass by value :-) public static void main(final String[] args) { String test = “Check me”; foo1(test); System.out.println(test); foo2(test); System.out.println(test); } public static void foo1(String str) { str = null; } public static void foo2(String str) { str = str + “abhi”; } Output:- Check me Check me
- Abhi
Apologies for late reply (6 years!) but String is a primitive hence you get those results. Java is pass-by-value for primitives and pass-by-reference for non-primitives.
- James
What? String isn’t primitive, String is a class and here we are making an object of that string class
- Aqsa
Correctly to say that each object variable is reference and we can only pass this reference to method or reassign variable with new reference. I think you compare with C/C++. Where on language level is supported passing reference to reference (pointer to pointer). And data of object is not related to variable. We can pass address of variable which contain address where object is located. I think you understand me. In Java such functionality is not supported on language level. and to do this it require to create a new instance of your class with field which will hold a variable with reference to your object. For example, you want to pass Integer to method and change it in the body of that method but there is no method to change value of Integer object. So you need to create wrapper class for that Integer object and pass it to method.
- Victor
So, java pass object by reference
- Victor
Before reading this post, i have understood this core concept, but realised it after i read this post. Java is always pass by value, value will be always primitive. Value can never be Object type, infact if we are passing object it seems we are passing the memory address of that object. This memory address is again an int value. Most of the books, authors failed to explain this. So here it is GREAT. “Java is pass by value, and sometimes pass through reference”.
- Manu M
Hi Pankaj, thanks for including this nice post with good explanation. This post is very simple and easy to understand the reason for ‘why Java is pass by value but not by reference’. From your post it is clear that reference means reference to the memory location of the object. Each memory location holds a number i.e VALUE. This value is useful in identifying that memory location. So If there is a reference to an object, it means it is reference to the address location of that object. So, java refers the objects by their memory address. The name used to refer that memory location (i.e value) is termed as reference variable. As we are passing the reference of the memory location, java is pass by value (of the memory address of the object) but not pass by reference. One suggestion, if you would have added the explanation about primitive data types also, it would have helped many readers in understanding why swap method works in case of primitives but not objects. However, this is a very nice post right to the point.
- johny
Thanks i was confused from last month…
- Singh
Nice Explanation sir.Thanks
- Venkata Sriram
These definitions are very counter intuitive. When your argument to a function is an object, java creates a copy of the “object reference” and passes that into the function scope. So, you are feeding in a reference to an object, which is a memory address, and because it is a copy of the original, Java becomes “pass by value.” Intuitively you would assume that passing in a reference somehow cannot be considered “pass by value” since it is called a reference. Definitions like this are part of the reason so many people are intimidated by coding. In my computer science courses, professors have started saying that objects as arguments in java are “pass by reference” because you are passing in their reference. Only way to change the status quo I suppose.
- Dan
I loved your comment, this is the reason for all the confusion around it.
- Pankaj
But in case of pass by value ,since a copy is passed the original one doesnt get changed which occurs in case of primitive data types ,but same we do in case of Objects ,its original value gets changed
- Pankaj Tandakar
I think that the post topic is somehow misleading/confusing. Of course Java is pass by value for primitives and pass by reference for objects - you even proved that drawing arrows (references!, not values). On the other hand those references (i.e. memory location addresses) are passed by value - that is how I think it should be understood.
- konrad
Totally agree with your opinion. I believe “Pass by Value: The method parameter values are copied to another variable and then the copied object is passed, that’s why it’s called pass by value.” is misunderstanding. Because right description should be “Pass by Value: The method parameter values are copied to another variable and then the copied reference is passed, that’s why it’s called pass by copied reference.” Bejond
- Bejond
Great explanation, thank you.
- Igorovics
Hi Pankaj, from the video i understood exactly, so the video solution is much much better, thanks for all your work, your site is always a “reference” for my java development understanding. thanks and keep doing your thing. Stefan from Romania.
- Stefan Banu
Very nicely explained
- Rahul Jain
It was a great post. In video you are using stack memory for static methods memory allocation.Can you please explain why so?.Static methods exist in pergen space of heap
- Brihati Jain
good one. Aprreciated
- bin
Very useful explanation and tutorial in whole. Thanks.
- Olga Guskova
Really good explanation (especially on the video content)
- Esakki
good post ,Thanks
- qiangyu
But in case of pass by value ,since a copy is passed the original one doesnt get changed which occurs in case of primitive data types ,but same we do in case of Objects ,its original value gets changed
- Pankaj Tandakar
I think that the post topic is somehow misleading/confusing. Of course Java is pass by value for primitives and pass by reference for objects - you even proved that drawing arrows (references!, not values). On the other hand those references (i.e. memory location addresses) are passed by value - that is how I think it should be understood.
- konrad
Totally agree with your opinion. I believe “Pass by Value: The method parameter values are copied to another variable and then the copied object is passed, that’s why it’s called pass by value.” is misunderstanding. Because right description should be “Pass by Value: The method parameter values are copied to another variable and then the copied reference is passed, that’s why it’s called pass by copied reference.” Bejond
- Bejond
Great explanation, thank you.
- Igorovics
Hi Pankaj, from the video i understood exactly, so the video solution is much much better, thanks for all your work, your site is always a “reference” for my java development understanding. thanks and keep doing your thing. Stefan from Romania.
- Stefan Banu
Very nicely explained
- Rahul Jain
It was a great post. In video you are using stack memory for static methods memory allocation.Can you please explain why so?.Static methods exist in pergen space of heap
- Brihati Jain
good one. Aprreciated
- bin
Very useful explanation and tutorial in whole. Thanks.
- Olga Guskova
Really good explanation (especially on the video content)
- Esakki
good post ,Thanks
- qiangyu
But in case of pass by value ,since a copy is passed the original one doesnt get changed which occurs in case of primitive data types ,but same we do in case of Objects ,its original value gets changed
- Pankaj Tandakar
I think that the post topic is somehow misleading/confusing. Of course Java is pass by value for primitives and pass by reference for objects - you even proved that drawing arrows (references!, not values). On the other hand those references (i.e. memory location addresses) are passed by value - that is how I think it should be understood.
- konrad
Great explanation, thank you.
- Igorovics
Hi Pankaj, from the video i understood exactly, so the video solution is much much better, thanks for all your work, your site is always a “reference” for my java development understanding. thanks and keep doing your thing. Stefan from Romania.
- Stefan Banu
Very nicely explained
- Rahul Jain
It was a great post. In video you are using stack memory for static methods memory allocation.Can you please explain why so?.Static methods exist in pergen space of heap
- Brihati Jain
good one. Aprreciated
- bin
Very useful explanation and tutorial in whole. Thanks.
- Olga Guskova
Really good explanation (especially on the video content)
- Esakki
good post ,Thanks
- qiangyu
Thank you so much for creating video. Your tutorials are really helpful.
- Narendra Koli
Dear Mr. Pankaj, I have a confusion with this method: private static void foo(Balloon balloon) { //baloon=100 // line1 balloon.setColor(“Red”); //baloon=100 balloon = new Balloon(“Green”); //baloon=200 balloon.setColor(“Blue”); //baloon = 200 } In Line1,Could you please tell me why balloon points to “Blue” Object instead of “Red” Object ?
- Albert
Hi, Can you please declare an array of integer and initialize it with some values. then pass this array to some method (return type void) and add 1 to all of the elements in array. and come back in main and try to print array element… this will print the incremented values. Can you do clear this thing why its happens.
- Mandeep Sharma
I understand that Java is always pass by value, what I don’t understand is what exactly is the difference between pass an object by reference and pass an object reference by value. If you pass the reference value, isn’t that essentially the same thing? What would change in the swap and balloon examples? Currently I only understand the fact that calling the class’s constructor allocates a different memory set for the variable, otherwise I can’t see the difference. That’s why a lot of people say that Java passes objects by reference, because the behavior, if not identical, is extremely similar.
- Gadrov
Damn it., That’s one of the simplest way to explain it. Thanks a ton Guru :)
- Praveen
Man, you’re so confused it’s not funny. Stop writing stuff on the internet, people here believe all they see. Consider this - it’s an equivalent C program that passes a struct by reference and the behaviour is exactly the same as in Java: #include typedef struct s { const char *colour; } balloon; void swap (balloon *b1, balloon *b2) { balloon *tmp = b1; b1 = b2; b2 = tmp; } int main (int argc, char **argv) { balloon b1, b2; b1.colour = “red”; b2.colour = “blue”; swap (&b1, &b2); printf (“red: %s, blue: %s\n”, b1.colour, b2.colour); return 0; }
- Renat
Hello. Thanks for a good explanation. Yet, I suppose, there is an issue what to mean passing by value or by reference. Look there –https://www.careerride.com/C++-pass-by-value-and-pass-by-reference.aspx. I like very much the idea, that the main difference is: By val – The procedure code does not have any access to the underlying element in the calling code; By ref – The procedure code gives a direct reference to the programming element in the calling code. So, to my mind it is not clear that swap method is a correct way to obviously say if a language passes vars by value or by ref.
- Vyacheslav
Thanks Pankaj for explaining it more clearly in video. Now doubt is cleared.
- Jagadish
Thanks a lot pankaj. That was a very good explanation.
- Arunkumar
Very Urgent please help me. Can you explain me how to draw memory diagram for following java code. public class ArrayOfReferences { public static void main(String[] args) { String[] names; /* How many objects do we have? */ int numberOfNames = 3; Scanner scanner = new Scanner(System.in); /* Reading names */ names = new String[numberOfNames]; /* How many objects do we have? */ for (int idx = 0; idx < names.length; idx++) { System.out.println("Enter the name of a friend: "); names[idx] = scanner.next(); } /* Printing names */ System.out.println("Your friends are: "); for (int idx = 0; idx < names.length; idx++) { System.out.println(names[idx]); } scanner.close(); } }
- Bhagwati Lal
Hi Pankaj, Thanks for such a wonderful article. I have one question based on your article. import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List a = new ArrayList(); a.add(“Apple”); System.out.println(“LIST SIZE”+a.size()); addInList(a, “Banana”); addInList(a, “COFFEE”); System.out.println(“LIST SIZE”+a.size()); } public static void addInList(List list, Object ojb){ list.add(ojb); System.out.println(“LIST SIZE::”+list.size()); } } output: LIST SIZE1 LIST SIZE::2 LIST SIZE::3 LIST SIZE3 If java support pass by value then why list size is modified In last print statement list size should be 1, Could you clarify to me Thanks Dharmendra
- Dharmendra
Excellent explanation.
- Rahul
this post clear my all problem. thank you keep posting
- Anurag Singh
Pankaj: I’m not a new programmer, but fairly new to Java. Once again your calm and helpful manner has come through for me. Thanks for the clarity.
- Christopher
it is the best explenation about pass by reference and pass by value. everything is too clear right now
- Pooya
Awesome explanation, thanks
- Balwinder Singh
I believe that you don’t fully understand pass by value and pass by reference. primitive parameters are passed by value. reference parameters are passed by reference. pass by value means a copy of the primitive is sent to the method - any changes to the parameter will not change the original value. pass by reference means that the address of the object is sent to the method - any changes to the parameter’s instance members will result in that change being made in the original value… What you are talking about in this article has nothing to do with pass by reference, instead you are talking about changing the address that the parameter points to, to some new location in memory – the address is constant but the data that the pointer refers to is not.
- William L. DeRieux IV
Appreciate your vedio
- Himanshu
Do you really ask this question in job interviews? These are the type of questions that make common interview practices as useful as a coin flip. Java passes variables by value (where object non primitive variables are actually references to an object). If someone can demonstrate they know how this works, rather than trying to answer a question that is known to be interpreted different ways. Have you ever known someone where answering this was the proving factor on their success? I guarantee there are people that have read that java passes object references by value, but would not be able to tell you the output of your tests. Please stop asking questions like this. Everyone, please stop using interview questions like this. Asking “is java pass by value or pass by reference” when you know people are going to get confused looks on their faces only serves the purpose of feeding ones ego an sense of supiority. Instead try seeing if the candidate can actually write correct functioning code, that they can grok what code examples may do. More importantly, put an effort in the interview to determine if the candidate is bright, driven and a strong personality fit for your team. This will improve your rate of hiring strong team members. Itwill reduce the number of false negatives which come from candidates incorrectly answering pointed trivia questions that help the interviewer feel good about themselves. It will also reduce the number of missed job opportunities for candidates who were asked poor questions that prove nothing about potential for success. The interview is. It about you (the I terviewer) it is about the candidate. Don’t leave an interview feeling smart because you were able to trick a candidate. Instead, leave the interview feeling good because you helped the candidate really show what the have to offer. Sorry to rant - I get frustrated with people perpetuating poor interview practices for the ‘80s. I know there are other good articles here that help provide deeper understanding of java. However, this article just feels disingenuous and a little smug to me.
- David
Hello Pankaj, If you think the program is passing balloon objects as pass by value. Consider this program, it is swapping the values now. package com.baloon; public class Test { public static void main(String[] args) { Balloon red = new Balloon(“Red”); //memory reference 50 Balloon blue = new Balloon(“Blue”); //memory reference 100 swap(red, blue); System.out.println(“red color=”+red.getColor()); System.out.println(“blue color=”+blue.getColor()); } //Generic swap method public static void swap(Balloon o1, Balloon o2){ /* Object temp = o1; o1=o2; o2=temp; */ o1.setColor(“Blue”); o2.setColor(“Red”); } } Output : red color=Blue blue color=Red
- Lokesh