Java 对同一对象的多个引用
有人能解释为什么第四条语句没有打印90,90吗? 第四行打印23,23。当点对象发生更改时,它也应该更改矩形对象,但不会更改 我指的是下面的URL,上面说对象可以有多个引用。为什么矩形同时引用同一个对象时不更改Java 对同一对象的多个引用,java,Java,有人能解释为什么第四条语句没有打印90,90吗? 第四行打印23,23。当点对象发生更改时,它也应该更改矩形对象,但不会更改 我指的是下面的URL,上面说对象可以有多个引用。为什么矩形同时引用同一个对象时不更改 请注意,因为正如您所写,这些都不是对同一对象的引用 Rectangle rect=新矩形(原点) 您从一个点对象创建了一个新的矩形,因此在运行时执行中有两个对象:一个矩形和一个点 您可以将new关键字视为数据从一个对象到另一个对象的简单复制粘贴,但不会进行深度链接(除非您在实现中强制执行
请注意,因为正如您所写,这些都不是对同一对象的引用
Rectangle rect=新矩形(原点)代码>
您从一个点
对象创建了一个新的矩形
,因此在运行时执行中有两个对象:一个矩形和一个点
您可以将new
关键字视为数据从一个对象到另一个对象的简单复制粘贴,但不会进行深度链接(除非您在实现中强制执行),因为正如您所写的那样,这些链接不是对同一对象的引用
Rectangle rect=新矩形(原点)代码>
您从一个点
对象创建了一个新的矩形
,因此在运行时执行中有两个对象:一个矩形和一个点
您可以将new
关键字视为数据从一个对象到另一个对象的简单复制粘贴,但不会进行深度链接(除非您强制实现)您的前提是错误的。这些都不是对同一对象的两个引用(一个是点
,另一个是矩形
),也不是矩形
对点
的引用
这是构造函数的代码(假设java.awt.Rectangle
):
也就是说,矩形从点解压坐标,并且不保留对原始点的其他引用,因此当点发生更改时,矩形不会更改
话虽如此,您在问题中链接到的教程中使用的确实包含对点的引用,因此,如果该点发生更改,将更新其原点位置。因此,我猜您在学习本教程时遗漏了该部分,并使用了错误的(内置)矩形类。您的前提是错误的。这些都不是对同一对象的两个引用(一个是点
,另一个是矩形
),也不是矩形
对点
的引用
这是构造函数的代码(假设java.awt.Rectangle
):
也就是说,矩形从点解压坐标,并且不保留对原始点的其他引用,因此当点发生更改时,矩形不会更改
话虽如此,您在问题中链接到的教程中使用的确实包含对点的引用,因此,如果该点发生更改,将更新其原点位置。因此,我猜您在学习本教程时错过了这一部分,使用了错误的(内置的)Rectangle
类。因为这些不是对同一对象的多个引用。简单的技巧:在Java中,如果前面有一个new
,它肯定会创建一个新对象。向我们展示Rectangle
构造函数。我很确定它是一个副本,而不仅仅是引用源对象。如果您包含代码中的点
和矩形
类(带包的完整限定名),这将非常有帮助。我猜这些是java.awt
类。在中,如果您查看您使用的java.awt.Rectangle
构造函数的代码,您将看到构造函数从提供的点
复制x/y值,但没有保存对该点本身的引用。我意识到了我的错误…谢谢大家。你们很快…谢谢,因为它们不是对同一个对象的多个引用。简单的技巧:在Java中,如果前面有一个new
,它肯定会创建一个新对象。给我们看Rectangle
构造函数。我很确定它是一个副本,而不仅仅是引用源对象。如果您包含代码中的点
和矩形
类(带包的完整限定名),这将非常有帮助。我猜这些是java.awt
类。在中,如果您查看您使用的java.awt.Rectangle
构造函数的代码,您将看到构造函数从提供的点
复制x/y值,但没有保存对该点本身的引用。我意识到了我的错误…谢谢大家。你们都很快…谢谢我认为问题是“为什么矩形
没有保留对点的引用”@kaya3我同意这可能是OP被混淆的原因,但我认为这两个答案都解决了OP可能被混淆的有效点。我的意思是,我认为OP不认为矩形
和点
是同一个对象。@kaya3我想你很困惑,我不是写这两个答案的人,我是第三方。我错了,评论中的小字体对我来说不是最好的。是的,我不认为我们不同意。我认为问题是“为什么矩形
不保留对点
”的引用@kaya3我同意这可能是OP混淆的原因,但我认为两个答案都解决了OP可能混淆的有效点。我的意思是,我认为OP不认为矩形
和点
是同一个对象。@kaya3我想你很困惑,我不是写这两个答案的人,我是第三方。我错了,评论中的小字体对我来说不是最好的。是的,我不认为我们不同意。
Point origin = new Point(23,23);
Rectangle rect = new Rectangle(origin);
1) System.out.println(origin.getX()+" "+origin.getY());
2) System.out.println(rect.getX()+" "+rect.getY());
System.out.println("----------------------");
origin.setLocation(90, 90);
3) System.out.println(origin.getX()+" "+origin.getY());
4) System.out.println(rect.getX()+" "+rect.getY());
public Rectangle(Point p) {
this(p.x, p.y, 0, 0);
}