Печать статической переменной без имени класса приводит к ошибке - PullRequest
0 голосов
/ 07 декабря 2018
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 ]

0 голосов
/ 07 декабря 2018

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

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

enter image description here

0 голосов
/ 07 декабря 2018

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

0 голосов
/ 07 декабря 2018

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

}
...