java中参数的传递都是值传递
下面举个例子
基本类型值传递
int a1 = 1;
int b1 = 2;
exchange(a1,b1);
exchange函数如下
public static void exchange(int a,int b){
int c = a;
a=b;
b=c;
}
上面的函数执行完后,a1还是1,b1还是2.
这是为什么呢,因为java中传递参数是值传递,在exchange函数中改变的仅仅是栈中在函数中生成的栈帧的值,而不是真正的修改了本来的a1,b1的值。
exchange函数在栈中可以分解如下:
所以,在exchange函数中改变的仅仅是栈帧a1’,b1’的值,而不影响本来的a1,b1。
在函数执行完后,a‘b’会被回收
引用类型的值传递
设在java中有一个Person类
Student a2=new Person();
Student b2=new Person();
a.name="张三";
b.name="李四";
exchange(a2,b2);
exchange函数如下
public static void exchange(Persona a,Person b){
Personc = a;
a=b;
b=c;
}
在函数中a2,b2指向的是new出来的存放在堆中的Person变量
函数执行完后,输出a2,b2的名字,a2还是叫张三,b2还是叫李四。
在上面的exchange代码中,在栈里生成了a,b,c三个栈帧,exchange函数修改的仅仅是他们的指向而已,并没有真正的改变在堆中的Person类的name值。
函数执行后如下:
在函数执行完后,a‘b’c‘会被回收
如何真正的修改值
将上面的exchange函数写成如下即可
public static void exchange(Persona a,Person b){
Personc = new Person();
c.name=a.name;
a.name=b.name;
b.name=c.name;
}
这样可以通过a’b’c’栈帧在栈中指向的堆中变量来修改name值