死磕面试系列,Java到底是值传递还是引用传递?( 二 )


当执行main方法时,会在堆内存中开辟一块内存,在栈内存中压入一个栈帧,栈帧中存储一个引用,指向堆内存中的地址 。

死磕面试系列,Java到底是值传递还是引用传递?

文章插图
当调用update方法时,会把main方法的栈帧拷贝一份,再压入栈内存中,指向同一个堆内存地址 。
死磕面试系列,Java到底是值传递还是引用传递?

文章插图
当执行update方法,重新初始化user对象,并重新赋值的时候 。会在堆内存中再开辟一块内存,再把栈内存中update栈帧指向新的堆内存地址,并修改新的堆内存中的数据 。
死磕面试系列,Java到底是值传递还是引用传递?

文章插图
从这里可以看出是值传递,修改了形参里面数据,实参并没有跟着变化 。
3.3 同一地址的引用类型验证/** * @author 一灯架构 * @apiNote Java传递示例 **/public class Demo {public static void main(String[] args) {User user = new User();user.setId(0);update(user);System.out.println("main方法中user:" + user);}private static void update(User user) {user.setId(1);System.out.println("update方法中user:" + user);}}输出结果:
update方法中user:User(id=1)main方法中user:User(id=1)可以看出update方法修改user对象的属性,main方法中user对象也跟着变了 。
死磕面试系列,Java到底是值传递还是引用传递?

文章插图
这是不是说明Java支持引用传递呢?
并不是 。这里在参数传递的过程中,只是把实参的地址拷贝了一份传递给形参,update方法中只修改了参数地址里面的内容,并没有对形参本身进行修改 。
4. 总结经过上述分析,Java参数传递中,不管传递的是基本数据类型还是引用类型,都是值传递 。
当传递基本数据类型,比如原始类型(int、long、char等)、包装类型(Integer、Long、String等),实参和形参都是存储在不同的栈帧内,修改形参的栈帧数据,不会影响实参的数据 。
当传参的引用类型,形参和实参指向同一个地址的时候,修改形参地址的内容,会影响到实参 。当形参和实参指向不同的地址的时候,修改形参地址的内容,并不会影响到实参 。
我是「一灯架构」,如果本文对你有帮助,欢迎各位小伙伴点赞、评论和关注,感谢各位老铁,我们下期见

死磕面试系列,Java到底是值传递还是引用传递?

文章插图

经验总结扩展阅读