Java, инициализация внешнего массива в методе

public class Main {

    public static void main(String[] args) {
        int[] list = null;

        init(list, 5); // инициализация массива длиной 5

        System.out.println("list: " + Arrays.toString(list)); // list: null

    }


    public static void init(int[] list, int length) {
        list = new int[length];
    }
}

Почему в вышеуказанном примере не получается инициализировать переменная list в методе init и как это обойти? Где можно почитать об этом?
Спасибо!


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

Автор решения: Igor
public static void main(String[] args) {
    int[] list = init(5); // инициализация массива длиной 5

    System.out.println("list: " + Arrays.toString(list)); // list: not null
}

public static int[] init(int length) {
    return new int[length];
}
→ Ссылка
Автор решения: Эникейщик

Потому что это - параметр, передаваемый в метод. Эта переменная уже инициализирована. В вашем коде она содержит null. Обойти это никак нельзя, да и непонятно, что в данном случае означает "обойти".

Почитать об этом можно в каждом учебнике. Глава про методы, функции, их параметры и т.д.

→ Ссылка
Автор решения: free_ze

Да, int[] - ссылочный тип. Но вы передаете в функцию ссылку - она копируется (сам адрес внутри, а хранящая его переменная - совершенно другая), а в теле метода пытаетесь изменить адрес копии.

Посему, чтобы добиться именно того, чего вы желаете, необходимо повысить косвенность (например, воспользовавшись массивом из одного элемента, содержащий ссылку на int[]):

public class Main {    
    public static void main(String[] args) {
        int[][] listRef = new int[1][];

        init(listRef, 5); // инициализация массива длиной 5

        int[] list = listRef[0];

        System.out.println("list: " + Arrays.toString(list));    
    }    

    public static void init(int[][] listRef, int length) {
        listRef[0] = new int[length];
    }
}

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

Почитать в том числе об этом можно в первом томе двухтомника К. Хорстманна.

→ Ссылка