by BehindJava

Does Java Support Pass by Value or Pass by Reference

Home » java » Does Java Support Pass by Value or Pass by Reference

This question has its origin in C and 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 in Java? The answer to this question is simple whenever a method parameter expects an object, a reference of that object is passed.

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 object using 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 will clear any doubt whether Java is pass by value or pass by reference. consider following example:

public class PassByValueExample {
 
    public static void main(String args[]) {
       int number = 3;
       printNext(number);
       System.out.println("number Inside main(): "+number);
    }
 
    public static void printNext(int number){
        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 value to method parameters, had Java pass by reference both main method and printNext() would have printed the same value. 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.

public class PassByReferenceConfusion {
 
    public static void main(String args[]) {
       Car car = new Car("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 void printBrand(Car car){
        car.brand = "Maruti";
        System.out.println("Brand of Car Inside printBrand(): "+car.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(): Maruti
Brand of Car Inside main()after: Maruti

If you see the change made in the method parameter is reflected globally i.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 conclude everything in Java including primitive and objects is pass by value. In case of object value of the reference is passed.