29

可能重复:
是否可以用 Java 编写交换方法?

给定两个值 x 和 y,我想将它们传递给另一个函数,交换它们的值并查看结果。这在Java中可能吗?

4

2 回答 2

38

不适用于原始类型(int, long,char等)。Java 按值传递内容,这意味着您的函数传递的变量是原始变量的副本,您对副本所做的任何更改都不会影响原始变量。

void swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
    // a and b are copies of the original values.
    // The changes we made here won't be visible to the caller.
}

现在,对象有点不同,因为对象变量的“值”实际上是对对象的引用——复制引用使其指向完全相同的对象。

class IntHolder { public int value = 0; }

void swap(IntHolder a, IntHolder b)
{
    // Although a and b are copies, they are copies *of a reference*.
    // That means they point at the same object as in the caller,
    // and changes made to the object will be visible in both places.
    int temp = a.value;
    a.value = b.value;
    b.value = temp;
}

限制是,您仍然不能以调用者可以看到的任何方式修改aorb本身的值(也就是说,您不能将它们指向不同的对象)。但是您可以交换它们引用的对象的内容。

顺便说一句,从 OOP 的角度来看,上述内容相当可怕。这只是一个例子。不要这样做。

于 2012-05-01T05:08:51.157 回答
5

我在这里会变得非常烦人和迂腐,因为“值”这个词在 Java 中具有非常特定的含义,人们通常并不经常理解,尤其是当变量包含对对象的引用时。

我将假设问题要求这种行为:

x = initialValueForX;
y = initialValueForY;
swap(x, y);
// x now holds initialValueForY;
// y now holds initialValueForX;

这是不可能的,因为 Java 按值将所有参数传递给方法。您永远不能以这种方式更改存储在其中的实际xy

但是,如果并保持对对象的引用,您可以更改两个对象的属性,以使打印的值看起来像彼此的初始值:xy

x = initialValueForX;
y = initialValueForY;
swap(x, y);
System.out.println(x);  prints what looks like initialValueForY
System.out.println(y);  prints what looks like initialValueForX

如果您对价值的理解是对象的样子,而不是对象的身份,则此方法有效。通常,这是可以接受的。

本打算在这里举一个很好的例子,但 cHao 已经这样做了。另外,其他人指出这是一个重复的问题。

于 2012-05-01T05:09:04.683 回答