2010-06-23 26 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);