疯狂JAVA-值传递和引用传递在内存执行情况

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值没变,这就是值传递,你改你的,我不动。
内存执行过程:
疯狂JAVA-值传递和引用传递在内存执行情况_第1张图片
当执行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的值也该变了。

内存实现过程:
疯狂JAVA-值传递和引用传递在内存执行情况_第2张图片
分析:

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,不再指向堆内存中的对象。

你可能感兴趣的:(疯狂JAVA-值传递和引用传递在内存执行情况)