我不确定这是Java行为还是流氓GWT行为。但是这里有。
我有一个2D矢量类,称为Vector2。在我的程序中,我做了一些由这个类的实例表示的2D粒子的模拟。我有两个Vector2,m_x和m_oldx数组,它们是另一个类的成员,具有执行某些处理的函数。这个函数的一部分如下,我对它的行为非常困惑:
Vector2 old = m_x[i];
Vector2 test = new Vector2(9.0f,9.0f);
m_x[i] = test;
// 1: at this point, m_x[i]'s values are 9.0,9.0
m_oldx[i] = old;
// 2: at this point, m_x[i]'s values are 100.0,100.0 - their original values before I assigned test to m_x[i]!
所以基本上,似乎由于我将old指定给m_oldx数组,m_x [i]的值被重置为其原始值!它不再等于我之前分配给它的测试变量。
当然不可能是对的?但这就是我发生的事情。我应该再次说我在这里使用GWT - 即这个代码由Google的编译器编译成Javascript。这是常规的Java行为还是GWT做错了什么?谢谢你的帮助......撕掉我的头发:(
答案 0 :(得分:3)
当出现这样的问题时,我首先想到的是m_x和m_oldx在某些时候已经设置为彼此相等,因为Java通过值将实例传递给变量而不是通过创建副本。例如,如果您在任何时候有:
m_oldx = m_x;
或
m_x = m_oldx;
这会导致这个问题。
答案 1 :(得分:2)
似乎m_x
和m_oldx
实际上是同一个数组,因此修改一个变量也会修改另一个变量。你可能早些时候这样做了:
m_oldx = m_x;
由于Java的对象引用语义不执行m_oldx = m_x
复制数组,因此它只是将m_oldx
设置为指向与m_x
相同的数组。如果你想复制它,你需要明确地这样做:
m_oldx = Arrays.copyOf(m_x, m_x.length);