0
 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);  
}

运行代码会产生:

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

我了解该函数如何更改 p1 的值,因为它是按值传递的。我不明白为什么 p1 和 p2 的交换失败了。

4

4 回答 4

4

Java始终是按值传递的。这是语和对象的唯一机制。

关键是要知道为对象传递了什么。这不是对象本身;存在于堆上。它是按值传递的对该对象 的引用。

您不能修改传递的引用并将新值返回给调用者,但您可以修改它所引用的对象的状态 - 如果它是可变的并公开适当的方法供您调用。

类与指针的交换,类似于 C 中的可能,不起作用,因为您无法更改传递的引用所指的内容并将新值返回给调用者。

于 2012-06-19T14:20:46.863 回答
3

myFunction()只是交换对函数内部两个对象的引用(与外部对象不同),但不交换函数外部的引用或对象实例本身!

于 2012-06-19T14:17:18.397 回答
2

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

于 2012-06-19T14:16:01.763 回答
0

对象是通过引用分配的,而不是克隆的,但是参数仍然作为对实际对象的引用,它们不会变成“对引用的引用”。

我的意思是引用与最初var1相同的对象,但随后您更改为引用另一个对象。这不会影响对象引用的内容,因为不是对 的引用,只是对与引用相同的对象的引用。p1var1p1var1p1p1

于 2012-06-19T14:18:13.663 回答