为何修改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
相关产品推荐
相关产品推荐

