Пожалуйста, объясните это поведение передачи эталонного параметра Java-массива
public class TestArray {
public static void main(String[] args) {
int[] ar = {1,2,3,4,5,6,7,8,9};
shiftRight(ar);
for (int i = 0; i < ar.length; i++) {
System.out.print(ar[i]);
}
// prints: 912345678 -- good
System.out.println();
reverseArray(ar);
for (int i = 0; i < ar.length; i++) {
System.out.println(ar[i]);
}
// prints: 91234567 -- I don't understand
System.out.println();
}
public static void shiftRight(int[] ar) {
int temp = ar[ar.length - 1];
for (int i = ar.length - 1; i > 0; i--) {
ar[i] = ar[i - 1];
}
ar[0] = temp;
}
public static void reverseArray(int[] ar) {
int[] temp = new int[ar.length];
for (int i = 0, j = temp.length - 1; i < ar.length; i++, j--) {
temp[i] = ar[j];
}
ar = temp;
for (int i = 0; i < ar.length; i++) {
System.out.print(ar[i]);
}
// prints: 876543219
System.out.println();
}
}
Передача массива в параметр приводит к передаче ссылки на массив в параметр; если в методе изменяется параметр массива, это изменение будет видно за пределами метода.
Первый способ,shiftRight
, делает то, что я ожидаю: он изменяет массив вне метода.
Второй метод, однако, не меняет массив вне метода. Но выполнение цикла for внутри метода выводит правильные значения. Почему не ссылкаar
указал наtemp
? Это потому, что переменнаяtemp
уничтожается, когда метод останавливается - это также убивает ссылку? Даже если это так, почему Java принимаетar
, которая была указана на ссылкуtemp
а затем повторно применить исходную ссылкуar
?
Спасибо.