Let us start from C Language. C supports “Pass-by-Value” and “Pass-by-Pointers”. C++ supports “Pass-by-value”, “Pass-by-reference” and “Pass-by-Pointers”. In Java, there is only “Pass-by-Value” – this is what the Java Specification says.
“Passing” is nothing but sending the parameters from a method call to a method definition. As a simple example, in the below program :
public int a;
public void Display( )
System.out.println( a );
public class PassingTest
public static void main( String  args )
Dog d1 = new Dog( );
public static void Fun( Dog d2 )
d.a = 6;
These terms are associated with method calling and passing variables as method parameters. Well, primitive types are always pass by value without any confusion.
The reference variable contains a kind of address (that java can understand) to locate the actual object in the heap. When we pass a reference type ( i.e. Dog type in our below example ) as a method parameter, always the memory address is copied to new reference variable ( i.e. d1 to d2 in our below example ) bit by bit. See the below program. So what gets copied from ‘d1’ to ‘d2’ is the value – the bit information used to locate the actual object on the heap.
In above example, address bits of first instance are copied to another reference variable, thus resulting both references to point a single memory location where actual object is stored. This is proved by printing the value of ‘a’. One more thing to remember is that, making another reference ‘d2’ to null will not make first reference ‘d1’ also null. But, changing state from either reference variable have impact seen in other reference also. The Java Spec says that everything in Java is pass-by-value. There is no such thing as “pass-by-reference” in Java.
About the Author:
Subhash.K.U, Principal Mentor,
Subhash Programming Classes, Bangalore