熟悉C/C++的朋友一定知道参数传递大致有值传递,引用传递,指针的方式也可以看做是值传递
因此在C/C++中,想要交换两个参数的值我们可以使用引用传递,或者直接使用指针,就可以实现
例如:
void swap1(int& a,int& b){
int temp=a;
a=b;
b=temp;
}//引用传递
void swap2(int* a,int* b){
int temp=*a;
*a=*b;
*b=temp;
}//使用指针
但是在java当中,只存在值传递这就导致了如下的写法是失败的,因为值传递,函数中只保留实参的副本,不会导致原来的参数的值发生变化
public void swap(int a,int b){
int temp=a;
a=b;
b=temp;
}//交换失败
但是有时候我们又会发现,java中是可以导致值的改变的,例如:
class Test{
int a;
public Test() {
}
public Test(int a) {
this.a = a;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
@Override
public String toString() {
return "Test{" +
"a=" + a +
'}';
}
}
public class Main {
public static void main(String[] args) {
Test a=new Test(6);
Test b=new Test(7);
change(a);
System.out.println(a);
}
public static void change(Test a){
a.setA(59);
}
}
这是为什么呢?
java中虽然是值传递,但是java的对象内部保存的值其实是地址值,我们知道java中通过new创建的对象是保存在堆空间中,堆空间中的变量不会随着函数的结束而销毁,因此,虽然进行的是值传递,但是依然可以修改对象的值。
我们可能联想到,既然对象保存的是地址,那么不用int,改用包装类型Interger可不可以实现交换呢?
很遗憾,依然不能这样交换,原因是:
翻看Integer源代码可以发现
/**
* The value of the {@code Integer}.
*
* @serial
*/
private final int value;
Integer中保存的值是value这个常量,也就是说不能修改Integer内部保存的值
然而我们实际应用过程中好像是可以修改的,原因如下:
void test(){
Integer a=6;
a=100;//a的值变为了100,但是本质不是修改a的值,而是新建了一个Integer,把这个新变量的值赋给了a
}
综上,我们也不能通过Integer实现数值的交换,那么如何实现像C/C++那样的数值交换呢?
大概只有通过封装自己的类,然后通过get,set方法才能实现了。