可能重复:
是否可以用 Java 编写交换方法?
给定两个值 x 和 y,我想将它们传递给另一个函数,交换它们的值并查看结果。这在Java中可能吗?
不适用于原始类型(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;
}
限制是,您仍然不能以调用者可以看到的任何方式修改a
orb
本身的值(也就是说,您不能将它们指向不同的对象)。但是您可以交换它们引用的对象的内容。
顺便说一句,从 OOP 的角度来看,上述内容相当可怕。这只是一个例子。不要这样做。
我在这里会变得非常烦人和迂腐,因为“值”这个词在 Java 中具有非常特定的含义,人们通常并不经常理解,尤其是当变量包含对对象的引用时。
我将假设问题要求这种行为:
x = initialValueForX;
y = initialValueForY;
swap(x, y);
// x now holds initialValueForY;
// y now holds initialValueForX;
这是不可能的,因为 Java 按值将所有参数传递给方法。您永远不能以这种方式更改存储在其中的实际x
值y
。
但是,如果并保持对对象的引用,您可以更改两个对象的属性,以使打印的值看起来像彼此的初始值:x
y
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 已经这样做了。另外,其他人指出这是一个重复的问题。)