Печать статической переменной без имени класса приводит к ошибке

public class ClearingDoubtsAboutStatic {

    static
    {
        System.out.println("Static Block1 Output: "+ClearingDoubtsAboutStatic.statVar);  //------Line 5
        statVar=20;  //-----Line 6
        System.out.println("Static Block1 Output: "+ClearingDoubtsAboutStatic.statVar); //------Line 7
        System.out.println("Static Block1 Output: "+statVar); //---Line 8

    }

    static int statVar=30;

    public static void main(String[] args) {

    }
}

Что я думаю, что line 7 and 8 даст тот же вывод, но это не так.

Мой вопрос

что я не понимаю, так это когда мы можем инициализировать статическую переменную без имени класса в line 6 но почему мы не можем напечатать это без имени класса в line 8?

3 ответа

2 правила, которые вы копируете / вставляете, неверны, вы должны учитывать только:

Статическое объявление и инициализация статического блока рассматриваются в порядке их появления в исходном файле.

Таким образом, вы можете исправить вашу проблему, изменив порядок объявления и статический блок инициализации:

static int statVar=30;

static
{
    System.out.println("Static Block1 Output: "+ statVar);  //------Line 5
    statVar=20;  //-----Line 6
    System.out.println("Static Block1 Output: "+ statVar); //------Line 7
    System.out.println("Static Block1 Output: "+statVar); //---Line 8

}

Хм, я не уверен в этом, но я поделюсь с вами своим предположением. Инициализация начинается сначала для всего, что является статическим в Классе (в определенном порядке). Так что ваши static{...} будет сначала инициализироваться, затем statVar получит свою стоимость. Первая печать должна показывать 0, так как это значение int по умолчанию. Это работает, потому что вы ссылаетесь на него по имени класса, и именно так должны ссылаться статические переменные. Существует одна статическая переменная для класса, а не для объекта. Когда вы пытаетесь сослаться на него без имени класса, вы воспринимаете это как некое поле в вашем классе, и вам не следует пытаться ссылаться на них до того, как они будут определены. Таким образом, компилятор не позволяет это сделать.

Я не совсем уверен в вашем случае, но в моем IntelliJ, когда я пробую ваш код, я получил это:

Error:(9, 55) java: illegal forward reference

ht tps://stackru.com/images/39271307518b045c2128795ed555b57bca89ddf9.png

Другие вопросы по тегам