Java对象引用与相等性判断困惑及代码疑问求助
搞懂Java引用变量的赋值逻辑
先看你最初的代码:
public class Practice { public int value; public Practice child; public Practice(int value) { this.value = value; } public static void main(String[] args) { Practice obj = new Practice(10); Practice obj2 = new Practice(9); Practice obj3 = new Practice(11); obj.child = obj3; obj.child = obj2; System.out.println(obj2 == obj3); // 输出false } }
为什么第一种情况输出false?
obj.child是一个引用变量,它的作用是存储内存中某个Practice对象的地址。
- 执行
obj.child = obj3:相当于把obj3指向的对象地址,复制给obj.child,此时obj.child和obj3都指向同一个value=11的对象。 - 再执行
obj.child = obj2:这是把obj2指向的对象地址,覆盖obj.child原来存储的地址。这一步只改变了obj.child的指向,和obj3这个变量本身没有任何关系——obj3依然指向原来的value=11的对象,obj2还是指向value=9的对象,所以obj2 == obj3比较两个变量的地址时,结果自然是false。
你之前误以为obj.child = obj2等价于obj3 = obj2,核心是混淆了「引用变量的指向」和「对象本身」。修改obj.child的指向,不会影响obj3这个变量的指向。
为什么修改obj.child.value会改变obj3的value?
看这段代码:
obj.child = obj3; obj.child.value = obj2.value;
- 第一步
obj.child = obj3后,obj.child和obj3指向同一个内存实例(value=11的那个对象)。 - 第二步
obj.child.value = obj2.value,是通过obj.child这个引用找到对应的对象,然后修改对象的value属性。因为obj3也指向同一个对象,所以通过obj3.value看到的就是修改后的值——本质是对象本身被修改了,所有指向它的引用都会同步看到变化。
为什么第三种情况obj2和obj3相等了?
看这段代码:
obj.child = obj3; obj2 = obj.child;
- 第一步
obj.child = obj3,obj.child和obj3指向同一个对象。 - 第二步
obj2 = obj.child,是把obj.child存储的对象地址(也就是obj3指向的地址)复制给obj2。此时obj2、obj.child、obj3都指向同一个对象,所以obj2 == obj3比较地址时,结果就是true。
核心总结
- 引用变量(比如
obj.child、obj2、obj3)只是存储对象地址的「标签」,给引用变量赋值,只是更换标签指向的地址,不会修改对象本身。 - 当你通过引用变量访问对象的属性(
.value)时,才是操作对象本身的数据,所有指向这个对象的引用都会看到变化。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

