引用传递和值传递的jvm解释

一.基本类型的值传递

示例代码:

public class ByValueDemo1 {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println("main:num="+num); // ?
    }
    public static void changeValue(int num) {
        num = 5;
        System.out.println("changeValue:num="+num); // ?
    } 
}

思考:
最后打印出的结果是多少?
通过运行代码我们可以发现打印出来的内容是:
main:num=10
changeValue:num=5
为什么呢?
1:每一个方法被调用,都会在栈内存中,开辟一块用于当前方法使用的空间(栈帧),该空间中存储了当前方法中用到的局部变量,也就是说JVM调用main方法时,在栈内存中开启了一块main方法使用的内存空间,里面有个叫num的变量,该变量被赋予了值为10
2:在调用changeValue方法时,把main方法中num变量存储的值复制了一份传递给了changeValue方法中的num变量,此时changeValue方法中num变量的值也是10,但是main方法中的num和changeValue方法中的num是相互独立的两个空间
3:把changeValue方法中num的值改成5,然后执行了打印语句,打印的内容是changeValue方法中的num变量的值,所以为5
4:changeValue方法调用结束后,该方法的内存从栈内存中消失,这块内存中所有的数据也销毁了
5:打印main方法中num变量的值,而main方法中num变量的值重来就没有改变过,所以依然不变还是10

我们一起来看看这些数据在JVM内存中主要分布和操作,如下图:

 

二.引用类型的值传递

示例代码:

public class User {
    long id;
}
public class ByValueDemo2 {
    public static void main(String[] args) {
        User u = new User(10L);
        changeValue(u);
        System.out.println("main:u.id="+u.id); // ?
    }
    public static void changeValue(User u) {
        u.id = 5;
        System.out.println("changeValue:u.id="+u.id); // ?
    } 
}

思考:
最后打印出的结果是多少?
通过运行代码我们可以发现打印出来的内容是:
main:u.id=5
changeValue:u.id=5
为什么同样是传递值调用方法,但是结果却完全不一样呢?
1:JVM调用main方法时,在栈内存中开启了一块main方法使用的内存空间,里面有个叫u的变量,该变量存入的是堆内存中User对象的内存地址,假设该地址是:0xabc,0xabc地址中有块叫id的内存空间,用于存储id的值
2:在调用changeValue方法时,把main方法中u变量存储的值复制了一份传递给了changeValue方法中的u变量,此时changeValue方法中num变量的值也是0xabc,同理main方法中的u变量和changeValue方法中的u变量也是相互独立的两个空间
3:changeValue方法中把堆内存上0xabc地址中id的变量的值改成5,然后再访问0xabc地址中id空间的值,当然打印出来是5,然后changeValue方法结束,同样该栈帧销毁
4:在main方法中也再次访问0xabc地址中id的变量的值,该值在之前的changeValue方法中已经被改成了5,所以在main方法也打印出来的结果自然也是5啦
我们一起来看看这些数据在JVM内存中主要分布和操作,如下图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值