Вот простой способ понять это.
Java всегда передает копии аргументов. Если аргумент является типом примитива (например, целым числом), то вызываемый метод получает копию значения примитива. Если аргумент является ссылочным типом, то вызываемый метод получает копию ссылки (, а не копия упомянутой вещи).
Когда начинается ваш метод main
, каждый из s_ccc
и t_ccc
ссылается на отдельный массив.
Это ситуация, когда в скобках указаны переменные, а в квадратных скобках указаны фактические структуры массива:
(s_ccc) ---> [7]
(t_ccc) ---> [7]
Если вы имели в виду calculate(s_ccc, t_ccc)
, то в начале метода calculate
:
(s_ccc) ---> [7] <---(b)
(t_ccc) ---> [7] <---(c)
Локальные b
и c
являются копиями глобалов s_ccc
и t_ccc
соответственно.
Все еще в пределах calculcate
, после того как b[0] = b[0] + 9
завершено:
(s_ccc) ---> [16] <---(b)
(t_ccc) ---> [7] <---(c)
Была изменена нулевая (единственная) позиция в массиве, указанном b
.
Назначение c = b
в calculate
создает такую ситуацию:
(s_ccc) ---> [16] <---(b)
^------(c)
(t_ccc) ---> [7]
Локальная ссылочная переменная c
теперь содержит ту же ссылку, что и b
. Это не влияет на глобальную ссылочную переменную t_ccc
, которая все еще ссылается на тот же массив, что и раньше.
Когда выходит calculate
, его локальные переменные (в правой части диаграмм) исчезают. Глобальные переменные (слева) не использовались в calculate
, поэтому они не затрагиваются. Конечная ситуация:
(s_ccc) ---> [16]
(t_ccc) ---> [7]
Ни c_ccc
, ни t_ccc
не были изменены; каждый из них по-прежнему ссылается на тот же массив, что и раньше calculate
. Вызов calculate
изменил содержимое массива, на который ссылается s_ccc
, используя скопированную ссылку на этот массив (в b
).
Локальная переменная c
начиналась как копия t_ccc
и манипулировалась в calculate
, но это не изменило ни самого t_ccc
, ни его ссылочных данных.