Это передача по значению - в этом случае передаваемое значение является адресом (Java вызывает эти ссылки) для блока памяти, содержащего экземпляр массива.
Этоприсваивается в вашем локальном параметре: item
.Когда вы делаете item.add(...)
, он пытается разыскивать - искать - объект, на который указывает адрес в локальном item
- и выполнять операцию (add
) над ним.
Чтобы проиллюстрировать, что это все еще передается по значению, рассмотрим следующее (синтаксис может быть не совсем корректным):
ArrayList<String> x = null;
addItems(x);
void addItems(ArrayList<String> arr) {
// arr will now have the null address
// arr.add("xxx"); -> throws NullPointerException -> nothing to dereference
// Consider another scenario, if here I do:
arr = new ArrayList<>();
// x outside won't see the change, because it had copied over its address, null
// but not the "real" x symbol reference itself.
}
В случае таких примитивов, как int
, значением является сам контент,значение типа 3 - это серия битов, скопированных в локальный параметр.
Но для не-примитивов, начиная с Object
- вы в основном получаете адреса в качестве значения - пока вы не примените оператор .
, который ищет объект, на который ссылается переменная.1019 *
Надеюсь, что это имеет больше смысла.