简体   繁体   中英

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.

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.

myFunction()刚换到里面的函数的两个对象(这是从外面那些不同)的引用,但换的功能,也没有对象实例本身之外的参考!

在正式参数位置将生成一个引用的副本,因此将有一个指向Point实例的新引用

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM