Java值传递
今天学习了Java值传递,和同学赌了赌第一个和第二个输出结果,还好第二个赌对了,上代码
public static void main(String[] args) {
int a = 10;
int b = 20;
// 交换a,b的值,并输出
change(a, b);
System.out.println(a);
System.out.println(b);
// 根据student类命名a1,b1
Student a1 = new Student();
Student b1 = new Student();
a1.name = "张三";
b1.name = "李四";
// 交换a1,b1,并输出
change1(a1, b1);
System.out.println(a1);
System.out.println(b1);
}
public static void change(int a, int b) {
int c = a;
a = b;
b = c;
}
public static void change1(Student a, Student b) {
Student c = a;
a = b;
b = c;
}
第一个值传递中,通过函数在栈中建了个a,b的副本,并且新声明了个变量c,通过操作后交换数据,但是,只是交换了a,b副本的值,所以在函数结束后就没了呀,就没了!
所以,虽然交换了数据,但是只交换了副本的数据,所以还是没有任何变化。
第二个值传递,实际上a,b的值“张三”、“李四”实际上存在堆中,之后调用函数会在栈中创建新的a,b的副本,同样指向“张三、李四”,在函数运行结束后,它又没了。。。
所以,还是结果没变
那么我们这么调用:
public static void change2(Student a, Student b) {
Student c = new Student();
c.name = a.name;
a.name = b.name;
b.name = c.name;
}
那么,这才在调用函数时,在栈中创建副本,但是,c是new了个新的Student对象,所以多创建了一个对象!
所以这次调用直接修改了对象的值,便成功修改了值
这就是Java中的值传递