疯狂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值没变,这就是值传递,你改你的,我不动。
内存执行过程:
这里写图片描述
当执行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,不再指向堆内存中的对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值