2014-02-11 3 views
0

Я готовлюсь к сертификации Java и смущен ссылками на объекты в этом случае. В этом фрагменте кода я не могу понять, почему элементы ArrayList и массивы не затрагиваются, когда мы назначаем им новый объект?Смущает ссылки на объекты

ArrayList<StringBuilder> myArrList = new ArrayList<StringBuilder>(); 
    StringBuilder sb1 = new StringBuilder("Jan"); 
    StringBuilder sb2 = new StringBuilder("Feb"); 
    myArrList.add(sb1); 
    myArrList.add(sb2); 

    StringBuilder[] array = myArrList.toArray(new StringBuilder[2]); 
    for(StringBuilder val : array) { 
     System.out.println(val); 
    } 

    StringBuilder sb3 = new StringBuilder("NNN"); 
    sb2 = sb3; 

    for(StringBuilder val : array) { 
     System.out.println(val); 
    } 

    for(StringBuilder val : myArrList) { 
     System.out.println(val); 
    } 

Выход:

Jan 
Feb 
Jan 
Feb 
Jan 
Feb 

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

+4

Прочитайте это http://stackoverflow.com/questions/40480/is-java-pass-by-reference – Christian

ответ

4

Ссылки являются указателями. Присвоение нового значения переменной заключается в том, что эта точка указателя относится к другому объекту. Так, в самом начале, у вас есть массив с двумя элементами:

array[0] ---> Jan <--- sb1 
array[1] ---> Feb <--- sb2 

Затем вы создаете другой StringBuilder, на который ссылается SB3:

array[0] ---> Jan <--- sb1 
array[1] ---> Feb <--- sb2 
sb3 --------> NNN 

Тогда вы говорите, что переменная sb2 должны ссылаться на один и тот же объект в качестве переменной SB3:

array[0] ---> Jan <--- sb1 
array[1] ---> Feb 
sb3 --------> NNN <--- sb2 

Как вы видите, массив [0] и массив [1] по-прежнему ссылаться на одни и те же объекты, Ян и февраль

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