Вызываю из статического блока метод, не инициализирует

160
26 сентября 2019, 14:50

Из статического блока вызываю метод который инициализирует массив (причем в самом методе это видно - выводит 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

Answer 1

Хоть @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

Answer 2

тут более человекочитаемое объяснение, без "магии":
инициализация static Integer[] array = new Integer[100]; заменяет собой уже заполненный массив
ты использовал Integer - он передается по ссылке, значение по-умолчанию null
новый массив не заполнялся значениями - он длиной 100 и заполнен null

READ ALSO
Удаление переменных [закрыт]

Удаление переменных [закрыт]

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

182
Как сделать полностью прозрачное окно с непрозрачной рамкой?

Как сделать полностью прозрачное окно с непрозрачной рамкой?

Мне нужен полный доступ к прозрачной части, те

154
Проблема с AdMob

Проблема с AdMob

Изменил подпись APK c Android debug на свою и перестал получать рекламу от AdMob(Ошибка 3)

182