Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода?

Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода? Почему? А если передать примитив?


Ответы (1 шт):

Автор решения: стасевич

Запомни раз и навсегда! в java всё передаётся по значению (pass by value).

Это значит, что при передаче в метод примитива, у нас создаётся копия, ты можешь крутить и менять её значение внутри метода как угодно, но на само значение это никак ни повлияет.

public class Solution {

    static void test(int num) {
        System.out.println(num); // копия
        num += 1; // пробуем увеличить на 1
        System.out.println("после увеличения " + num);
    }

    public static void main(String[] args) {
        int a = 5;

        test(a);
        System.out.println(a);
    }
}

вывод -

5  
после увеличения 6  
5

А вот со ссылкой посложнее.
На примере массива, массив - это объект, находящийся в куче(она же хип), который может хранить данные, например примитивы.
Передавая массив(объект) в метод, мы получаем копию ссылки, по ссылке мы можем изменить состояние объекта в хипе, но не можем поменять саму ссылку.

public class Solution {

    static void test(int[] arr, int[] arr2) {
        arr[0] = 777; // меняем значение 1го элемента в массиве

        arr = arr2;//указываем ссылкой на другой массив
        System.out.println(Arrays.toString(arr)); // вывод [0]

    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        int[] arr2 = {0};

        test(arr, arr2); 
        System.out.println(Arrays.toString(arr)); // вывод [777, 2, 3]
    }
}
 

Нечто похожее происходит и с ключевым словом final если обозначить примитив словом final мы не можем изменить значение, если пометить ссылочный тип, значение можем менять (кроме immutable объектов), а вот адрес, куда указывает ссылка нет.

→ Ссылка