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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:10:30