学习 java 的时候最开始觉得这个参数传递应该很简单啊,就像C#一样,传参数就行了,但其实它有着底层不一样的东西,先来看代码和结果
public class Main {
public static void main(String[] args){
Main m=new Main();
int a=10;
int b=5;
m.swap(a,b);
System.out.println("a"+a +" b"+b);
}
public void swap(int m,int n){
int temp =m;
m=n;
n=temp;
System.out.println("m"+m+" n"+n);
}
}
swap 里面是一个非常简单的数据交换的一个抽象的方法
那在 main 里调用这个方法后,a 和 b 的值就交换了,但是结果不是我想象的那个样子~
a 和 b 的值没交换,但是 m 和 n 的值交换了
没有数据交换的代码图示
在调用swap方法前内存中的情况如下图所示
栈中的 m 存的是new Main() 的地址 0x 3344
int a=10;
int b=5;
也在栈中有了具体的内容
那接下来看调用swap方法
调用的 swap 方法里面是相当于在栈中添加了 m 和 n ,将 a 和 b 的值赋过去了,所以在进行交换的时候也就是 m 和 n 进行了交换,当swap执行完毕的时候栈中的关于 swap 这个方法的内容就会被清除
所以这个时候 a 和 b 的值是没有改变的,也就没有起到交换的作用
那改如何进行交换呢
可以进行数据交换的代码图示
public class Main {
public static void main(String[] args){
Main m=new Main();
DataSwap ds=new DataSwap();
m.swap(ds);
System.out.println("ds.i:"+ds.i +" ds.j"+ds.j);
}
public void swap(DataSwap d){
int temp =d.i;
d.i=d.j;
d.j=temp;
}
}
class DataSwap{
int i=10;
int j=5;
}
结果
在调用 swap 方法前是这个样子的
调用 swap 方法
先在栈中添加了 d 再将 ds 的值赋值给 d 这个时候可以发现 ds 中存放的是 dataswap 的地址 ,那这个时候 d 中存放的也就变成了地址,那也就同样的指向了 dataswap
这样 经过 swap 的交换后就交换的是 dataswap 里面的具体数据了,也就真正实现了数据交换.
后记
嗯,看来以后如果遇到问题还得通过画图来好好分析一番,我大概是理解了它的内容,你理解了吗?