Это классическая подножка для Java начинающих. Частью проблемы является то, что нам не хватает общего языка для определения этого. Передаются ли параметры по значению? Объекты передаются по ссылке? В зависимости от того, с кем вы разговариваете, будут разные реакции на слова, проходящие по значению и проходящие по ссылке, хотя каждый хочет сказать то же самое.
Способ визуализации заключается в том, чтобы понять, что переменная java может быть одной из двух вещей. Он может содержать примитив или ссылку на объект. Подумайте об этой ссылке как о числе, указывающем на местоположение в памяти. Это не указатель в значении C++, поскольку он не указывает на определенную ячейку памяти, это скорее дескриптор, поскольку он позволяет JVM искать конкретную ячейку памяти, в которой объект может быть найден. Но вы можете себе это так:
ArrayList<Integer> outer = @1234; //The first reference where the ArrayList was created.
Вы затем вызвать внутренний с параметрами:
Puzzle.change(@1234);
Обратите внимание, что вы не сдадите внешнюю переменную, необходимо передать значение @ 1234. внешний не может быть изменен каким-либо образом, являясь параметром метода. Это то, что мы имеем в виду, когда говорим, что проходим по значению. Значение передается, но оно отключается от внешней переменной.
Внутри головоломки:
public static void change(ArrayList<Integer> inner) { // a new reference inner is created.
//inner starts out as @1234
inner.add(7);
//now inner becomes @5678
inner = new ArrayList<Integer>();
//The object @5678 is changed.
inner.add(23);
//And printed.
System.out.println(inner);
}
Но внешняя по-прежнему указывает на @ 1234, как метод не может изменить эту ситуацию, он никогда не имел внешнюю переменную, она только что его содержимое. Однако, поскольку метод изменения начался со ссылкой на @ 1234, объект в этом месте действительно может быть изменен методом и результатами, видимыми для любой другой ссылки на @ 1234.
После того, как метод изменения завершен, ничто не ссылается на объект @ 5678, поэтому оно становится пригодным для сбора мусора.
Это не головоломка, а базовая концепция. Google для «вызов по значению против вызова по ссылке». –