2013-11-22 6 views
3

Если я добавлю объект в ArrayList в Java, я добавлю ссылку на него, правильно? Так что возьмите эту ситуацию. Я создаю объект с именем obj и устанавливаю его в значение. Затем я зациклирую определенное количество раз, и каждый раз, когда я немного изменяю obj (например, изменяю его положение), а затем добавляю его в ArrayList. После каждой последовательности цикла я возвращаю obj к значению по умолчанию, поэтому следующая последовательность будет иметь новый obj для изменения. Предполагая, что я все время передавал ссылки obj, все в ArrayList также будет установлено значение по умолчанию? Из тестирования я вижу, что значения не меняются и все разные, что я считаю странным. Может ли кто-нибудь уточнить?Как работают элементы в ArrayList?

Block b = block.clone(); 

    for(int x = 0; x < amountX; x++){ 
     Vector3f offset = new Vector3f(0, 0, 0); 
     offset.x = x * block.getScale().x; 

     for(int y = 0; y < amountY; y++){ 
      offset.y = y * block.getScale().y; 

      for(int z = 0; z < amountZ; z++){ 
       offset.z = z * block.getScale().z; 
       b.move(offset); 
       addBlocks(b); 
       b = block.clone(); 
      } 
     } 
    } 

    for(Block a : blocks) 
     System.out.println(a.getPosition()); 

addBlocks добавляет блок в ArrayList. Последний цикл печатает все разные позиции. Block.clone() просто создает новый блок с теми же параметрами.

+3

Много текста с несколькими кодами. Можете ли вы поделиться кодом, с которым работаете? –

+2

Мы ненавидим читать текст :) Покажите нам код для объекта реселлера по умолчанию. – MariuszS

ответ

2
Object o = new Object(); 

На данный момент вы больше не изменяете объект, вы изменяете ссылку. т. е. создания нового объекта и указания этой переменной на нем.

do 
{ 
    Object o = new Object(); // set o to point to a new Object 
    arrayList.add(o); //add a reference to the new object to the ArrayList 
}while(true) 

во второй раз через эту петлю, первый объект, созданный в памяти POS1 говорят, ссылается Arraylist [1]. Но вы затем меняете, где объект o указывает на память, создавая новый (в pos2) и указывая на него с помощью o. Теперь у вас есть два объекта в памяти, один из которых указан в [1] в списке массива, а один - в объекте o.

Если вы изменяете объект, а не ссылку, вы получите поведение, о котором говорите, например.

do 
{ 
    g.setName("Steven"); 
    arrayList.add(o); 
}while(true) 
+0

Итак, если я создаю новый экземпляр объекта, он также создает новый объект в куче? Значит, теперь объект не указывает на то, к чему он привык? – Kipras

+0

Да. Вы говорите, что Object o становится равным новому объекту в куче. –

+0

@ Kipras, что сейчас «новые» работы, да. –

Смежные вопросы