Последовательность загрузки классов переменной класса при инициализации переменной класса - PullRequest
1 голос
/ 16 июля 2011

Когда я запускаю эту программу, иногда получается, что 55 будет напечатано, хотя я уверен, что 6 - правильное поведение.

Или, может быть, я ошибался?

public class Test {
    static int a = 55;

    static {
        a = 6;
    }

    public static void main(String abc[]){
        // a is 6
        System.out.println(a);
    }
}

Редактировать

Я думаю, что Cularis понял это правильно, когда я изменил порядок статического блока, а также создание экземпляров и инициализацию, 55 напечатано. Это действительно в порядке текстуры.

public class Test {
    static {
        a = 6;
    }

    static int a = 55;

    public static void main(String abc[]) {
        // a is 55
        System.out.println(a);
    }
}

1 Ответ

2 голосов
/ 16 июля 2011

Посмотрите Спецификацию языка Java , особенно

12.4.2 Подробная процедура инициализации

... Далее выполните любую переменную классаинициализаторы и статические инициализаторы класса, или инициализаторы полей интерфейса, в текстовом порядке , как если бы они были единым блоком, за исключением переменных конечного класса и полей интерфейсов, значения которых являются константами времени компиляцииинициализируются первыми (§8.3.2.1, §9.3.1, §13.4.9)....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...