1.值传递:顾名思义,就是实参传给形参的是值,我把值复制一份给你,你怎么改动与我无关
public class Test{
public static void main(String args[]){
int a = 33;
int b = 44;
swap(a,b);
System.out.println("main方法里a的值是 "+a+",b的值是 "+b);
}
public static void swap(int a ,int b){
int temp;
temp = a;
a= b;
b = temp;
System.out.println("swap方法里a 的值是 "+a+",b的值是 "+b);
}
}
运行结果:
swap方法里a 的值是 44,b的值是 33
main方法里a的值是 33,b的值是 44
你会发现swap方法里的变量a、b值交换了,main方法里的变量a、b值没变,这就是值传递,你改你的,我不动。
内存执行过程:
当执行main方法时,在栈里给变量a、b分量两个空间并赋值33、44,在调用swap方法时,给形参变量又分配了两个空间a、b,并且赋值33、44,这个时候占内存其实有4个变量,swap函数把a、b的值交换了,如最右所示,swap里的a、b变量变为44、33,并没有影响main方法中的a、b变量。
2.引用传递顾名思义,就是传递给形参的是引用,相当于是对象在内存空间的指针
public class Test{
public int a =33;
public int b = 44;
public static void main(String args[]){
Test panda = new Test();
swap(panda);
System.out.println("main方法里a的值是 "+panda.a+",b的值是 "+panda.b);
}
public static void swap(Test panda){
int temp;
temp = panda.a;
panda.a = panda.b;
panda.b = temp;
System.out.println("swap方法里a 的值是 "+panda.a+",b的值是 "+panda.b);
}
}
运行结果:
swap方法里a 的值是 44,b的值是 33
main方法里a的值是 44,b的值是 33
唉、你会发现swap函数交换a和b的值,把类的变量a、b的值也该变了。
内存实现过程:
分析:
Test panda = new Test();
创建对象时在内存中分配两个空间,栈里分配一个空间存变量的引用panda,panda存的是对象在堆内存的地址,也就是panda引用这个对象,在堆内存里分配空间存这个对象的具体内容。
swap(panda);实参panda传递给形参panda的是引用,也就是栈内存给形参panda分配一个空间并且存对象的引用地址,相当于实参、形参引用同时指向堆内存中同一个对象,所以在swap函数执行完交换了a、b值时,不论用main里引用panda还是swap里的引用panda去调属性a、b值时都是一样的。
**tip:**swap函数执行完时,swap里的panda引用会被置为null,不再指向堆内存中的对象。