我们都知道,在c/c++中要交换两个参数的值有两种方法。
1 直接在main函数中交换(交换整形a b的值)
int temp=a;
a=b;
b=temp;
2 自己定义一个swap的方法
swap(int *p1,int * p2){
int temp=*p1;
*p1=*p2;
*p2=temp;
}
学过java的都知道,java中没有指针的概念,那么在java中何如实现两个值的交换呢?
1 最好的方法是在main方法里实现交换
int temp=a;
a=b;
b=temp;
2 现在我要像c那样,自己写一个方法实现交换,可行吗?
public static void main(String[] args) {
int a=1,b=2;
System.out.println("change before:"+a+"\t\t"+b);
change(a,b);
System.out.println("change after:"+a+"\t\t"+b);
}
private static void change(int a, int b) {
int temp=a;
a=b;
b=temp;
}
change before:1 2
change after:1 2
于是,这种方案是行不通的。
现在,我们把这个程序变一变
public class Test {
static class A{
int value;
}
public static void main(String[] args) {
Test.A aa=new Test.A();
Test.A bb=new Test.A();
aa.value=1;
bb.value=2;
System.out.println("change before:"+aa.value+"\t\t"+bb.value);
change(aa,bb);
System.out.println("change after:"+aa.value+"\t\t"+bb.value);
}
private static void change(A aa, A bb) {
int temp=aa.value;
aa.value=bb.value;
bb.value=temp;
}
}
change before:1
2
change after:2 1
达到了我们的要求
有人可能回想:把int换成Integer。这样的答案也是否定的,并不可行。
总结:java中传递基本数据类型的时候是值传递,故不会改变实参的值。
java中传递对象类型的时候是地址传递,可以改变实参的值。