java中的参数传递都为值传递,八大基本类型在方法中传值是直接传值的,无论是在java还是c中都是这样的。而引用类型在传递时会传递过去一个它在堆中的地址。这样的参数传递方式就会导致一些在参数交换产生一些问题,下面这些数值交换方法的使用就会体现出这一点。
public class Main {
public static void main(String[] args) {
SingleInstance instance = SingleInstance.getInstance();
Student a = new Student();
Student b = new Student();
a.setName("zhangsan");
b.setName("lisi");
System.out.println(a);
System.out.println(b);
swap1(a,b);
System.out.println(a);
System.out.println(b);
swap(a,b);
System.out.println(a);
System.out.println(b);
int c =10;
int d=20;
Integer e =10;
Integer f=20;
swap(c,d);
System.out.println(c);
System.out.println(d);
swap(e,f);
System.out.println(e);
System.out.println(f);
}
private static void swap1(Student e, Student f) {
String name = e.getName();
e.setName(f.getName());
f.setName(name);
}
private static void swap(Student e, Student f) {
Student a= e;
e=f;
f=a;
}
private static void swap(int a, int b) {
int c =a;
a=b;
b=c;
}
private static void swap(Integer a, Integer b) {
Integer c =a;
a=b;
b=c;
}
}
swap1交换是会将a和b的地址传进去,这个时候,name会通过get方法拿到name所在的存储地址,只后对name地址进行交换,最终结果就会让a和b的name交换。
而与其相对应的是swap,这里e和f分别指向a和b的堆中地址,交换了e和f的地址但是并不影响到a和b,e和f出栈后,a和b不变
swap(int a, int b)交换的是传入的a和b,在出栈后不会影响到c和d。
swap(Integer a, Integer b)因为是包装类型所以和上面一样,a和b指向的地址没有发生改变所以不变。
从上面可以看出来,如果真的想要交换对象中的数据就必须要将里面最底层的数据全部交换才可以,否则只是方法内的地址变了并不影响方法外的变量存储地址。