You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将两个指向对象的引用互相赋值时会产生什么效果?

Java引用类型赋值行为答疑
Rectangle r1 = new Rectangle( 5 );
Rectangle r2 = new Rectangle( 10 );
Rectangle r3 = r1;

r1.length = 30;
r1 = r2;
r2 = r3;
r1 = r2;

首先明确前提:Java中Rectangle是引用类型,所有引用类型的变量存储的都不是对象本身,而是堆内存中对应对象的内存地址,赋值操作复制的也只是地址值,不会复制对象本身。

赋值操作的具体执行过程

我们先给三个初始化生成的对象做标记方便说明:

  • 长度为5的初始Rectangle对象记为对象A
  • 长度为10的初始Rectangle对象记为对象B

前3行初始化完成后:r1指向对象A,r2指向对象B,r3复制了r1的地址,也指向对象A。
执行r1.length = 30后,对象A的length属性被修改为30,r1、r3的指向不变。

执行r1 = r2时

  • 把r2中存储的对象地址(对象B的地址)复制给r1
  • 执行后r1的指向从对象A变更为对象B,r2的指向保持不变,仍然指向对象B

执行r2 = r3时

  • 把r3中存储的对象地址(对象A的地址)复制给r2
  • 执行后r2的指向从对象B变更为对象A,r3的指向保持不变,仍然指向对象A

后续执行r1 = r2时,r2当前存储的是对象A的地址,复制给r1后,r1的指向也变更为对象A,最终三个变量全部指向同一个对象A。

对r2的操作是否会同步作用到r1上

这个需要分场景判断:

  • 如果操作执行时,r1和r2指向同一个对象:修改r2指向的对象的属性(比如r2.length = 50),通过r1访问同一个属性时会读到修改后的值,看起来像是同步生效,本质是两个变量指向同一块内存的同一个对象
  • 如果操作执行时,r1和r2指向不同的对象:对r2指向的对象的所有修改都不会影响r1指向的对象
  • 如果是给r2本身重新赋值(比如r2 = new Rectangle(20)):这种操作只是修改r2本身存储的地址值,变更r2的指向,完全不会影响r1的指向,也不会修改任何原有对象的属性

内容的提问来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:15:02