Думайте об этом с точки зрения памяти: давайте проанализируем вашу первую программу -
В mainx
, fyeah
- это массив int
s, поэтому это ссылка (или указатель, если можно). Эта ссылка указывает на место в памяти кучи, где хранится фактический массив int
s. Скажем, по адресу 100. Смежные отсюда расположены три целых (скажем, начиная с адресов 100, 104 и 108 соответственно 2, 3 и 4).
Теперь вы вызываете свой метод smth
и передаете ссылку. Внутри метода есть еще одна ссылка (int
тип массива) с именем fyeah
. Этот fyeah
совершенно отличается от fyeah
ссылки в методе mainx
. Теперь, когда вы вызываете smth
и передаете fyeah
из mainx
, fyeah
в методе smth
инициализируется так, чтобы указывать на то же местоположение (т. Е. Адрес памяти 100)
Когда вы обращаетесь к элементу 0 fyeah
и присваиваете ему значение 22, он достигает ячейки памяти 100 и записывает это значение 22 туда. Когда вы возвращаетесь в свой метод mainx
, ссылка fyeah
все еще ссылается на адрес памяти 100. Но значение, присутствующее в этом месте, теперь равно 22. Таким образом, вы получаете это значение, когда получаете доступ к первому элементу из fyeah
в mainx
.
Теперь ваша вторая программа. Ваш метод mainx
объявляет int
(не массив, а простой int
) и устанавливает его равным 5. Эта переменная fyeah
создается в стеке, а не в куче. Значение 5 хранится в стеке. Теперь вы вызываете smth
и передаете эту переменную. В методе smth
вы снова объявляете переменную int
, fyeah
по имени (в качестве формального аргумента метода). Опять же, это отличается от fyeah
метода mainx
, и это fyeah
также создается в стеке. Эта переменная будет инициализирована значением 5, скопирована из fyeah
, переданного в smth
в качестве аргумента. Теперь обратите внимание, что есть две различные копии переменных fyeah
, обе в стеке, и оба имеют значение 5. Теперь вы присваиваете fyeah
в smth
значение 22. Это не повлияет на fyeah
метод mainx
, поэтому, когда вы возвращаетесь к mainx
и получаете доступ к fyeah
, вы видите 5.