使用java语言实现Swap函数,该函数用于交换两个Integer类型
@halty说的极好.
我看你问题里说的是 交换两个Integer类型, 按理这里传了两个对象的引用, 可以对 对象本身做一些操作. BUT, Integer对象是不可变的, 它的API没有任何对内部值最修改的 方法; 看一下源码也知道, 内部的int也是final的:
private final int value;
如果我们非要做 对int的 swap, 那么只有自己定义个 int型的 wrapper了:
class MyInteger{
private int value;
public MyInteger(int i) {this.value=i;}
public void setValue(int value){this.value=value;}
public int getValue(){return this.value;}
public static void swapMyInteger(MyInteger a, MyInteger b){
MyInteger c=new MyInteger(a.getValue());
a.setValue(b.getValue());
b.setValue(c.getValue());
}
}
Java的对象传递是引用传递,所以没法实现swap功能。
举个栗子,公司里的雇员用类对象来表示
class employee{
String job;
int salary;
}
当出现工作调动,两个员工要互相交换岗位,你一定会交换他们的工作和薪水(类成员),而不是交换这两个员工的灵魂(对象地址,我们假设肉体和灵魂是分开的)。
对象比喻起来就像是一个人(当然也可以描述成一辆车、一头牛)一样,你能改变的是描述该个体的外在(衣服,工作等),但你没法改变他的灵魂(也没有必要)。如果改变了他的灵魂(内存地址交换),那他就不在是“他”了。
请再认真考虑一下“面向对象”的意义。
C/C++中swap功能的本质:通过传递变量地址(指针或引用)来交换变量地址中的值。
Java标榜其中对C/C++一个很大的改进就是:Java对程序员屏蔽了变量地址的概念,减少指针误用。
在Java世界中函数或者叫方法的入参都是通过值拷贝的方式进行传递:
所以正常来说,Java不能实现C/C++中的swap功能。