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 шт):
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. Обойти это никак нельзя, да и непонятно, что в данном случае означает "обойти".
Почитать об этом можно в каждом учебнике. Глава про методы, функции, их параметры и т.д.
Да, 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.
Почитать в том числе об этом можно в первом томе двухтомника К. Хорстманна.