Пожалуйста, объясните это поведение передачи эталонного параметра 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?

Спасибо.

Ответы на вопрос(4)

Ваш ответ на вопрос