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

为何修改Point对象后Rectangle坐标未同步?Java对象引用疑问

为什么修改origin指向的Point后,Rectangle的坐标没同步变化?

这问题我刚学Java面向对象的时候也踩过一模一样的坑!咱们一步步拆解原因:

首先得搞清楚java.awt.Rectangle这个类的构造逻辑——当你用new Rectangle(origin)创建矩形时,它并没有持有传入的Point对象的引用,而是把这个Point里的x、y值直接复制到了自己内部的int类型成员变量里。

咱们对应你的代码一步步看:

  • 初始化origin = new Point(23,23),这时候内存里有一个Point对象,origin是指向它的引用。
  • 创建rect = new Rectangle(origin)时,Rectangle做的事情是:把origin指向的Point的x(23)和y(23)拿出来,存到自己的x和y字段里,之后rect就和origin指向的那个Point对象彻底没关系了。
  • 当你调用origin.setLocation(90,90),只是修改了origin指向的那个Point对象的坐标,但rect内部存的还是当初复制过来的23和23,自然输出不会变。

举个反例,如果是咱们自己写一个持有Point引用的Rectangle类:

class MyRectangle {
    private Point pointRef;

    public MyRectangle(Point p) {
        this.pointRef = p; // 直接持有传入的Point引用,不是复制值
    }

    public int getX() {
        return pointRef.getX();
    }

    public int getY() {
        return pointRef.getY();
    }
}

这时候你修改origin的坐标,myRect.getX()和myRect.getY()就会同步变成90,因为myRect一直拿着origin指向的那个Point对象的引用。

所以核心区别就是:构造方法是复制对象的属性值,还是持有对象的引用。Java标准库的Rectangle选择了前者,所以修改原Point不会影响它的坐标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:13:09