Из статического блока вызываю метод который инициализирует массив (причем в самом методе это видно - выводит 35). Но когда обращаюсь в коде - оказывается что он не инициализирован (выводит null), это как?
public class Main {
public static void main(String[] args) {
System.out.println("Value: " + Environment.array[0]);
}
}
class Environment {
static {
System.out.println("Static initialization");
method();
}
static Integer[] array = new Integer[100];
static void method() {
System.out.println("Method");
array = new Integer[10];
for (int i = 0; i < 10; i++)
array[i] = 35;
System.out.println("Value (static init): " + Environment.array[0]);
}
}
Результат:
Static initialization
Method
Value (static init): 35
Value: null
Хоть @Igor и технически верно ответил на вопрос, но немного деталей подкину. Статические поля в Java инициализируются в том порядке, в котором они определены.
jls-12.4:
The static initializers and class variable initializers are executed in textual order
Если вы переместите объявление массива перед static блоком с вызовом method, то всё будет ок.
class Environment {
static Integer[] array = new Integer[100];
static {
System.out.println("Static initialization");
method();
}
static void method() {
System.out.println("Method");
array = new Integer[10];
for (int i = 0; i < 10; i++)
array[i] = 35;
System.out.println("Value (static init): " + Environment.array[0]);
}
}
Вывод:
Static initialization
Method
Value (static init): 35
Value: 35
тут более человекочитаемое объяснение, без "магии":
инициализация static Integer[] array = new Integer[100]; заменяет собой уже заполненный массив
ты использовал Integer - он передается по ссылке, значение по-умолчанию null
новый массив не заполнялся значениями - он длиной 100 и заполнен null
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости