2010-06-23 4 views
0

Я не уверен, что это поведение Java или поведение GWT изгоев. Но здесь идет.Непонятное поведение (примеры 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]! 

Так в основном, это кажется, что в силу того, что я назначу старый в массив m_oldx, M_X [я]» s значение возвращается к исходному значению! Он больше не равен тестовой переменной, которую я назначил ранее.

Несомненно, что это не так? Но это то, что происходит для меня. Я должен еще раз сказать, что я использую GWT здесь, то есть этот код компилируется с Javascript компилятором Google. Является ли это регулярным поведением Java или GWT делает что-то неправильно? Спасибо за любую помощь ... разрывают мои волосы :(

+0

Я подозреваю, что здесь происходит что-то еще. Можете ли вы опубликовать короткий тестовый пример здесь, чтобы показать поведение? Кроме того, класс с этими данными в нем используется более чем одним потоком? –

+1

Не могли бы вы дать нам код, где вы создаете m_x и M_oldx? – tlayton

ответ

3

Когда возникают подобные проблемы, я сначала подумал, что в какой-то момент m_x и m_oldx были установлены равными друг другу, поскольку Java передает экземпляры в переменные по значению, а не путем создания копии. Например, если в любой момент у вас есть:

m_oldx = m_x; 

или

m_x = m_oldx; 

это вызвало бы эту проблему.

+0

Arrrggghhh ... вы правы. Я установил оба из них, чтобы ссылаться на другой массив, каждый из которых ссылается на то же самое. Мне явно нужно пересмотреть мою логическую логику Java! Большое спасибо, я бы, наверное, всю ночь был в этом. – Peter

+1

Хотя вы, вероятно, считали это правильным, в вашем ответе есть много чего возразить: у Java нет указателей, но ссылки и называть их указателями могут быть запутанными, и даже пусть другие думают, что с ними можно сделать арифметику указателей. Кроме того, Java имеет только один способ передачи (экземпляров) объектов: по значению (ссылка копируется значением!), Называя это «передача указателем», вводит в заблуждение (или даже неправильно). –

+0

Вы, конечно, правы. В моем ответе я использовал некоторую плохую терминологию. Он был скорректирован соответствующим образом. – tlayton

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); 
Смежные вопросы