将两个指向对象的引用互相赋值时会产生什么效果?
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
相关产品推荐
相关产品推荐

