Is Java Pass by Value or Pass by Reference? Example (original) (raw)
Hello guys, Does Java is pass by value or pass by reference is one of the tricky Java questions mostly asked on both beginner and experienced level Java developer interviews. Before debating_whether Java is pass by value or pass by reference_ lets first clear what is pass by value and what is pass by reference actually means?. This question has its origin in Cand C++ where you can pass function parameter either value or memory address, where value is stored (pointer). As per Java specification everything in Java is pass by value whether its primitive value or objects and it does make sense because Java doesn't support pointers or pointer arithmetic, Similarly multiple inheritance and operator overloading is also not supported in Java.
This question becomes confusing when the interviewer asks about how an object is passed to a method in Java? The answer to this question is simple whenever a method parameter expects an object, a reference of that object is passed.
This reference is like primitives' value which can be copied and two variable holding this reference is still two different variable and if you change the value of one reference variable to point to another object reference, the second variable will not be affected. This is different then changing the object which both these variable points.
Many programmers confuse reference with pointers here which is not correct, reference is a kind of handle that is used to locate object, or change the object, but it doesn’t allow any pointer arithmetic i.e. you can not increase or decrease memory address and locate a different objectusing reference in Java.
Pass by Value and Pass by Reference Example in Java
Let’s see two examples of calling method and passing parameter this willclear any doubt whether Java is pass by value or pass by reference. consider following example:
public classPassByValueExample {
public static voidmain(String args[]) {
int number = 3;
printNext(number);
System.out.println("number Inside main(): "+number);
}
public static voidprintNext(intnumber){
number++;
System.out.println("number Inside printNext(): "+number);
}
}
Output:
number Inside printNext(): 4
number Inside main(): 3
Above example clearly shows that primitives are passed as pass by valueto method parameters, had Java pass by reference both main method and printNext() would have printed the same value.
In fact, when you pass the "number" variable to printNext() method a copy of the value number variable is holding is passed to the printNext() method. So, its actually a copy by value.
Passing an Object to Java method
Now look at another example of passing an object as a method parameter which will confuse you that Java is pass by reference, which Java is not. In fact what happens here is a copy of reference is created and passed to method.
public classPassByReferenceConfusion {
public static voidmain(String args[]) {
Car car = newCar("BMW");
System.out.println("Brand of Car Inside main() before: "+ car.brand);
printBrand(car);
System.out.println("Brand of Car Inside main()after: "+ car.brand);
}
public static voidprintBrand(Car car){
car.brand = "Maruti";
System.out.println("Brand of Car Inside printBrand(): "+car.brand);
}
private static classCar{
private Stringbrand;
public Car(String brand){
this.brand = brand;
}
}
}
Output:
Brand of Car Inside main() before: BMW
Brand of Car Inside printBrand(): Maruti
Brand of Car Inside main()after: Maruti
If you see the change made in the method parameter is reflected globallyi.e. brand of car is changed in all places it means one object is used in both methods. Well in reality if you pass an object as a method parameter in Java it passes "value of reference" or in simple term object reference or handles to Object in Java.
Here reference term is entirely different than reference term used in C and C+ which directly points to a memory address of variable and subject to pointer arithmetic. in Java object can only be accessed by its reference as you can not get a memory address where the object is stored or more precisely there is no method to get the value of an object by passing memory address.
To prove the point that reference variable is passed by value, I will show you another example:
public class PassByCopyOfReference {
public static void main(String args[]) {
Car car = new Car("BMW");
System.out.println("Brand of Car Inside main() before passsing: "+ car.brand);
printBrand(car);
System.out.println("Brand of Car Inside main()after: "+ car.brand);
}
public static void printBrand(Car newCar){
newCar= new Car("Tesla");
System.out.println("Brand of Car Inside printBrand(): "+ newCar.brand);
}
private static class Car{
private String brand;
public Car(String brand){
this.brand = brand;
}
}
}
Output: Brand of Car Inside main() before: BMW Brand of Car Inside printBrand(): Tesla Brand of Car Inside main()after: BMW
You can see that the value of "car" variable after calling the method in main() is printed as "BMW" and not "Tesla" because we didn't change the object pointed by "car" variable in main(), instead we changed the "newCar" variable to point to new object which is Tesla.
This proves that when you pass the object, only its reference is copied and passed to method parameter. This happens when you call printBrand() method, both "car" and "newCar" points to a Car object which is "BMW" but later "newCar" points to a "Tesla" but "car" still points to "BMW" because they are two separate copies.
It's said that a picture is worth a thousand word, let's if the below picture can help you to understand this concept better. You can clearly see that initially both "car" and "newCar" pointing to same object but when we created new object and assigned that to newCar variable both are pointing to difference object because a copy of reference of "BMW" object was passed rather than actual object.
That's all about whether Java is pass by value or pass by reference. To conclude everything in Java including primitive and objects is pass by value, I mean "Java is always pass by value". In case of object value of the copy of reference is passed. Every time you pass a primitive or object a copy of value is passed whether its actual primitive value which reside in stack or an object reference which points to the actual object in the heap. From the code example I shared above, we have also proved this point for once and all.
Other Java Interview articles you may like