Вот что печатает программа C #:
** Внутри Main, перед вызовом метода, первый элемент: 1
Внутри метода первый элемент: -3
Внутри Main, после вызова метода, первый элемент: 888 **
Спросите себя, почему arr [0] установлено на 888 в Main () после вызова Change () ? Вы ожидали -3?
Вот что происходит. Переменная массива int pArray обрабатывается как локальная переменная внутри метода Change () . Первоначально он устанавливается как ссылка на экземпляр массива, который ему передается. (В примере программы это будет обр в Main () ). Линия
**pArray = new int[5] { -3, -1, -2, -3, -4 }; // This change is local.**
вызывает создание нового массива, и pArray устанавливается как ссылка на этот новый массив вместо arr из Main () .
Программа не распечатывает длины массива. Если бы это было так, длина была бы 3, 5 и 3 соответственно.
Вы можете попробовать следующее:
public class TestPassByRefByVal
{
public static void Change(int[] pArray)
{
int [] lArray = { -3, -1, -2, -3, -4 };
pArray[0] = 888; // This change affects the original element.
pArray = lArray; // This change is local.
System.out.println("Inside the method, the first element is: " + pArray[0]);
}
public static void main(String[]args)
{
int [] arr = { 1, 4, 5 };
System.out.println("Inside Main, before Change(), arr[0]: " + arr[0]);
Change(arr);
System.out.println("Inside Main, after Change(), arr[0]: " + arr[0]);
}
}