Java中对象传递是引用的值传递,即传递引用副本。p和ref指向同一堆对象,修改ref.name会改变共享对象,但ref重新赋值不影响p,原对象在堆中持续存在直至无引用被回收。

在Java中,对象的传递始终是引用传递,但这里的“引用”本身是按值传递的。理解这一点对掌握内存变化至关重要。
对象引用传递的本质
Java中所有对象都存储在堆(heap)内存中,而变量保存的是指向这个对象的引用(可以理解为地址)。当把一个对象传给方法时,实际上传递的是这个引用的副本,而不是对象本身。
也就是说,形参和实参指向同一个堆中的对象,但它们是两个不同的引用变量。
内存区域的变化过程
假设有一个类:
立即学习“Java免费学习笔记(深入)”;
class Person { String name; }
执行以下代码:
Person p = new Person();
p.name = “Alice”;
腾讯Effidit
腾讯AI Lab开发的AI写作助手,提升写作者的写作效率和创作体验
65 查看详情
change(p);
void change(Person ref) {
ref.name = “Bob”;
}
内存变化如下:
在堆中创建一个 Person 对象,字段 name 初始为 null 栈中变量 p 存储该对象的引用 调用 change 方法时,栈中为参数 ref 分配空间,并将 p 的值(引用)复制给 ref 此时 p 和 ref 指向同一个堆对象,修改 ref.name 实际上修改了共享对象 方法结束后,ref 被销毁,但堆对象依然存在,p 仍可访问它
修改引用与修改对象的区别
关键区别在于:
通过引用修改对象属性(如 ref.name = “Bob”)会影响原对象,因为操作的是堆中数据 如果在方法内让 ref 指向新对象(如 ref = new Person()),只是改变了局部引用,不会影响外部的 p 原对象在堆中不变,除非没有其他引用指向它,才会被垃圾回收
总结:引用传递的内存特点
Java对象引用传递时:
引用变量本身按值传递(拷贝一份) 多个引用可指向同一堆对象 通过任一引用修改对象内容,其他引用可见 方法内重新赋值引用不影响原引用变量基本上就这些。不复杂但容易忽略细节。
以上就是在Java中对象引用传递时内存如何变化的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1101664.html
微信扫一扫
支付宝扫一扫