2010-06-23 20 views
0

我不确定这是Java行为还是流氓GWT行为。但是在这里。令人费解的行为(Java实例,数组和GWT)

我有一个2D矢量类,名为Vector2。在我的程序中,我对由这个类的实例表示的二维粒子进行了一些模拟。我有两个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]! 

所以基本上,似乎凭借的是我给你旧到m_oldx阵列,m_x [I]”事实s值被重置为其原始值!它不再等于我之前分配给它的测试变量。

当然,这不可能是正确的?但这就是我发生的事情。我应该再次说我在这里使用了GWT - 即这个代码被Google编译器编译成Javascript。这是正常的java行为还是GWT做错了什么?感谢您的帮助......撕裂了我的头发:(

+0

我怀疑还有其他事情在这里发生。你可以在这里发布一个简短的测试用例来显示行为吗?另外,这个数据中的类是否被多个线程使用? – 2010-06-23 19:18:23

+1

你能给我们提供你创建m_x和M_oldx的代码吗? – tlayton 2010-06-23 19:19:33

回答

3

当这样的问题发生时,我的第一个想法是m_x和m_oldx在某个时刻被设置为彼此相等,因为Java通过值将实例传递给变量,而不是通过创建副本。例如,如果在任何时候你有:

m_oldx = m_x; 

m_x = m_oldx; 

会导致此问题。

+0

Arrrggghhh ...你是对的。我已经设置了这两个引用另一个数组,每个引用相同。我显然需要修改我的Java参考逻辑!非常感谢,否则我可能整晚都在这里。 – Peter 2010-06-23 19:27:11

+1

虽然你可能认为它是正确的,但在你的回答中有很多东西需要反驳:Java没有指针,但引用它们并将它们命名为指针可能会令人困惑,甚至可能让其他人认为你可以对它们进行指针运算。另外,Java只有一种方式来传递(实例)对象:通过值(引用被值复制!),将其称为“传递指针”,具有误导性(甚至是错误的)。 – 2010-06-23 19:29:43

+0

你当然是对的。我在答案中使用了一些不好的术语。它已被相应地纠正。 – tlayton 2010-06-23 19:36:29

2

看来,m_xm_oldx其实都是同一个阵列,所以修改一个变量修改等,以及你可能这样做早些时候:

m_oldx = m_x; 

因为Java的对象引用的语义做m_oldx = m_x副本的阵列,它只是设置m_oldx指向同一个数组作为m_x的。如果你想复制它,你将需要明确这样做:

m_oldx = Arrays.copyOf(m_x, m_x.length);