bouncingHippo
bouncingHippo

Reputation: 6040

Swapping function : Java Pass-By-Value code failed

 public void swap(Point var1, Point var2)
 {
  var1.x = 100;
  var1.y = 100;
  Point temp = var1;
  var1 = var2;
  var2 = temp;
 }

public static void main(String [] args)
{
  Point p1 = new Point(0,0);
  Point p2 = new Point(0,0);
  System.out.println("A: " + p1.x + " B: " +p1.y); 
  System.out.println("A: " + p2.x + " B: " +p2.y);
  System.out.println(" ");
  swap(p1,p2);
  System.out.println("A: " + p1.x + " B:" + p1.y); 
  System.out.println("A: " + p2.x + " B: " +p2.y);  
}

Running the code produces:

A: 0 B: 0
A: 0 B: 0
A: 100 B: 100
A: 0 B: 0

I understand how the function changes the value of p1 as it is passed-by-value. What i dont get is why the swap of p1 and p2 failed.

Upvotes: 0

Views: 592

Answers (4)

duffymo
duffymo

Reputation: 308753

Java is pass by value at all times. That's the only mechanism for both primitives and objects.

The key is to know what's passed for objects. It's not the object itself; that lives out on the heap. It's the reference to that object that's passed by value.

You cannot modify a passed reference and return the new value to the caller, but you can modify the state of the object it refers to - if it's mutable and exposes appropriate methods for you to call.

The class swap with pointers, similar to what's possible with C, doesn't work because you can't change what the passed reference refers to and return the new values to the caller.

Upvotes: 4

Emil Vikström
Emil Vikström

Reputation: 91912

Objects are assigned by reference, not cloned, but the arguments stay as references to the actual objects, they will not turn into "references to references".

What I mean is that var1 reference the same object as p1 initially, but then you change var1 to reference another object. This does not affect what object p1 references because var1 is NOT a reference to p1, only a reference to the same object as p1 is referencing.

Upvotes: 0

Sirko
Sirko

Reputation: 74036

myFunction() just swaps the references to both objects inside the function (which are distinct from those outside), but does not swap the references outside the function nor the object instances themselves!

Upvotes: 3

Jigar Joshi
Jigar Joshi

Reputation: 240870

There would be a copy of reference generated in formal argument place, So there would be a new reference pointing to instances of Point

Upvotes: 2

Related Questions