【问题标题】:Is it possible to swap two variables in Java? [duplicate]是否可以在 Java 中交换两个变量? [复制]
【发布时间】:2012-05-01 04:51:54
【问题描述】:

可能重复:
Is it possible to write swap method in Java?

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

【问题讨论】:

标签: java


【解决方案1】:

不适用于原始类型(intlongchar 等)。 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;
}

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

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

【讨论】:

  • 请问为什么从 OOP 的角度来看它是可怕的?我一直在子方法中看到对象突变。不过,我会在 ab 上添加空检查。
  • @ADTC: (1) 这不是子方法;这是 OP 要求的 其他功能。如果函数是在IntHolder 中定义的,并且value 是私有的,那么可能......但是(2)更糟糕的是,无论哪种方式,像这样的swap 只有在您将对象降级为“价值持有者”时才真正有用”。当你这样做时,你会忘记 OOP 背后的真正原因;数据只是函数操作的一些东西,从面向对象的角度来看这是一个倒退
  • 即使我们可以查看或处理这两个事实,(3) 向IntHolder 添加swap 方法几乎需要我们删除继承和封装。 (否则,每个子类还必须有一个名为 super.swap(b); 的方法,然后交换自己的字段,只是为了避免破坏 swap(b)。这变得非常丑陋,非常快,而且可以t 由 Java 编译器强制执行。)所以现在,我们已经抛弃了封装 继承,也几乎放弃了多态性的任何尝试。这是所有三个主要的 OOP 概念。
  • @cHao 哇,谢谢!现在很清楚为什么它是可怕的。真的很可怕。
【解决方案2】:

在这里我会变得非常烦人和迂腐,因为“值”这个词在 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 已经这样做了。另外还有人指出,无论如何这是一个重复的问题。

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2013-01-27
    • 2011-10-02
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多