给定两个值x和y,我想将它们传递给另一个函数,交换它们的值并查看结果。这在Java中是否可行?
答案 0 :(得分:32)
不是原始类型(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
或b
本身的值(即,您无法将它们指向不同的对象)。但是你可以交换他们引用的对象的内容。
答案 1 :(得分:6)
如果不使用任何对象或数组,就无法在Java中执行此操作。
答案 2 :(得分:5)
我会在这里变得非常讨厌和迂腐,因为“值”这个词在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已经做了。另外还有其他人指出这是一个重复的问题。)