Массив int [] в вашем примере является ссылочным типом. Это означает, что и p1.arr
, и p2.arr
указывают на один и тот же массив в памяти.
Если вы измените значение первого индекса на p1.arr
, это означает, что значение первого индекса на p2.arr
также изменится. Следовательно, поведение в фрагменте кода 1.
Разница во втором фрагменте кода заключается в том, что вы изменяете ссылку на массив p1. Теперь p1.arr
является ссылкой на новый объект. p2.arr
по-прежнему содержит ссылку на «оригинальный» массив. Таким образом, печать p2.arr[0]
печатает 1.
EDIT
Чтобы, надеюсь, убрать некоторые сомнения, возможно, будет понятнее, если вы помните, что набрали:
p1.Name = "Name2";
на самом деле:
p1.Name = new String("Name2");
Это точно так же, как с вашим массивом int []. Вы не изменяете значение p1.Name
, вы создаете новый строковый объект и изменяете ссылку для p1.Name на этот новый строковый объект. p2.Name по-прежнему содержит собственную ссылку на «оригинальный» строковый объект, а именно «Name1». Изменяя ссылку p1.Name
, , ссылка не изменяется.