我试图将形状对象的当前位置添加到我的arraylist中但是当对象位置改变时我的列表对象也会改变..
经过几个小时后的搜索,我找到了一种不同的方式,现在位置保持不变,即使对象位置发生变化这是我的第一个引起arraylist变化的代码:
MyPoint p11 = (MyPoint) getCorners()[0];
MyPoint p22 = (MyPoint) getCorners()[1];
MyPoint p33 = (MyPoint) getCorners()[2];
MyPoint p44 = (MyPoint) getCorners()[3];
这是永远不会改变对象位置的第二个代码
MyPoint p11 = new MyPoint(getCorners()[0].getX(), getCorners()[0].getY());
MyPoint p22 = new MyPoint(getCorners()[1].getX(), getCorners()[1].getY());
MyPoint p33 = new MyPoint(getCorners()[2].getX(), getCorners()[2].getY());
MyPoint p44 = new MyPoint(getCorners()[3].getX(), getCorners()[3].getY());
当我使用下面的代码时,我正在监视输出,并且他们改变了第一个代码,第二个他们没有
System.out.println(nl.get(0).getCorners()[0].getX());
System.out.println(nl.get(0).getCorners()[1].getX());
System.out.println(nl.get(0).getCorners()[2].getX());
System.out.println(nl.get(0).getCorners()[3].getX());
我的问题是我想知道并了解两者之间的区别 代码。
你可以向我们解释一下......提前致谢...
答案 0 :(得分:1)
当您执行MyPoint p11 = (MyPoint) getCorners()[0];
时,您仍然引用现有的不创建新文件,这意味着现有对象的任何修改都将反映在第11页
但是MyPoint p11 = new MyPoint(getCorners()[0].getX(), getCorners()[0].getY());
正在创建新对象。因此现有对象的任何修改都不会反映在p11
答案 1 :(得分:0)
问题在于,在第一个变体中,您放入了稍后更改的列表对象,在第二个变体中,您创建了这些对象的副本,因此当原始对象发生更改时,副本保持不变。
我建议您重构类MyPoint
,以便它是不可变的。这意味着值x
和y
将是最终的,并且没有方法setX
,setY
(您将初始化值x
和{{ 1}}在构造函数中)。
当您移动形状时,不是更改y
和x
的值,而是交换整个点。
这将允许您在多个形状中重复使用相同的点,您可以将这些点放入列表等,而不必担心它们稍后会被某些不相关的代码更改。
答案 2 :(得分:0)
嗯,我认为这发生在你身上,因为在你编写的代码中,你首先获得了对数组列表中对象的引用并将其分配给一个新对象,比如p11,但是这个新对象仍然指向现有的(它是对已经在arraylist中的那个的引用),所以无论你在p11上做出什么改变,它们都会反映在列表中的对象中,因为基本上它们是相同的。在第二种情况下,您将使用数组列表中对象的值创建类的新实例(通过将它们传递到构造函数中)。您定义的对象是一个新实例,它与列表中的对象完全不同,因此无论您对其进行哪些更改,列表中的相应对象都不会更改。