Skip to main content

skip to main content

developerWorks  >  Java technology  >

Understanding that parameters are passed by value and not by reference

developerWorks
Document options

Document options requiring JavaScript are not displayed


Rate this page

Help us improve this content


Level: Introductory

Peter Haggar (haggar@us.ibm.com), Senior Software Engineer, IBM

01 Sep 1999

Editor's note: The following articles are excerpts from the book "Practical Java" published by Addison-Wesley. You can order this book at Borders.com.

A common misconception exists that parameters in Java are passed by reference. They are not. Parameters are passed by value. The misconception arises from the fact that all object variables are object references. This leads to some unexpected results if you do not understand exactly what is happening. For example:


   import java.awt.Point;
   class PassByValue
   {
     public static void modifyPoint(Point pt, int j)
     {
        pt.setLocation(5,5);                                      //1
        j = 15;
        System.out.println("During modifyPoint " + "pt = " + pt +
                           " and j = " + j);
     }
     public static void main(String args[])
     {
        Point p = new Point(0,0);                                 //2
        int i = 10;
        System.out.println("Before modifyPoint " + "p = " + p +
                           " and i = " + i);
        modifyPoint(p, i);                                        //3
        System.out.println("After modifyPoint " + "p = " + p +
                           " and i = " + i);

     }
   }

This code creates a Point object, initialized to (0,0) , and assigns it to the object reference variable p at //2. It then assigns the primitive int i the value 10 . The static modifyPoint method is then called at //3, passing p and i. The modifyPoint method calls the setLocation method on the first parameter, pt , changing its location to (5,5) . In addition, the second parameter, j , is assigned the value 15. When the modifyPoint method returns, method main prints the values for p and i . What is the output of this code and why?

The output of this code is as follows:


   Before modifyPoint p = java.awt.Point[x=0,y=0] and i = 10
   During modifyPoint pt = java.awt.Point[x=5,y=5] and j = 15
   After modifyPoint p = java.awt.Point[x=5,y=5] and i = 10
 

This output shows that the modifyPoint method changed the Point object created at //2 but not the int,i . In main , i is assigned the value 10. Parameters are passed by value, therefore, a copy of i is passed to the modifyPoint method. This method changes the value of the copy to 15 and returns. The original value, i in main , is not changed.

On the other hand, you might think the Point object created at //2 is unmodified by the modifyPoint method. After all, Java passes parameters by value. Therefore, when modifyPoint is called with the Point object created at //2, a copy is made for the modifyPoint method to work with. Changes to the Point object in modifyPoint are not reflected in main because there are two different objects. Right? Wrong.

Actually, the modifyPoint method is working with a copy of a reference to the Point object, not a copy of the Point object. Remember that p is an object reference and that Java passes parameters by value. More specifically, Java passes object references by value. When p is passed from main to the modifyPoint method, a copy of the value of p, the reference, is passed. Therefore the modifyPoint method is working with the same object but through the alias, pt . After entering the modifyPoint method, but before the execution of the code at //1, the object looks like this:


Figure 1
Figure 1

Therefore, after the code at //1 is executed, the Point object has changed to (5,5) . What if you want to disallow changes to the Point object in methods such as modifyPoint ? There are two solutions for this:

  • Pass a clone of the Point object to the modifyPoint method.
  • Make the Point object immutable.



About the author

Peter Haggar is a Senior Software Engineer with IBM. He currently works on emerging Java and Internet technology and is the project lead for IBM's real-time Java reference implementation. He has a broad range of programming experience having worked on development tools, class libraries, and operating systems. He is also a frequent technical speaker on Java and other technologies at numerous industry conferences. He received a B.S. in Computer Science from Clarkson University in New York in 1987. He can be reached at haggar@us.ibm.com.




Rate this page


Please take a moment to complete this form to help us better serve you.



YesNoDon't know
 


 


12345
Not
useful
Extremely
useful
 


Back to top