Java-классы и статические блоки

class Hello12 {
    static int b = 10;
    static {
        b = 100;
    }
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

При выполнении вышеуказанного кода вывод получается как 100, потому что когда я вызывал класс Hello, статический блок выполняется сначала, устанавливая значение b в 100 и отображая его. Но когда я пишу этот код:

class Hello12 {
    static {
         b = 100;
    }
    static int b = 10;
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

Здесь результат равен 10. Я ожидаю ответа как 100, потому что как только статический блок выполнен, он дает b значение как 100. Поэтому, когда в main() я вызывал Hello.b, он должен был ссылаться на b (=100), Как распределяется память для b в обоих кодах?

4 ответа

Решение

В "Подробной процедуре инициализации" для классов, раздел 12.4.2 JLS гласит:

Затем выполните инициализаторы переменных класса и статические инициализаторы класса или инициализаторы полей интерфейса в текстовом порядке, как если бы они были единым блоком.

Это означает, что первый пример был таким:

b = 10;
b = 100;

И второй пример был:

b = 100;
b = 10;

Последнее задание "выигрывает", объясняя ваш вывод.

Статические блоки и статические переменные инициализируются в порядке их появления в источнике. Если ваш код:

class Hello12 {

  static int b = 10;
  static {
     b = 100;
  }

}

Результат 100.

Помимо ответа на вопрос о том, как код выполняется в каком порядке, я предполагаю, что вы также хотите знать, почему статический блок может ссылаться на статическую переменную, которая еще не была объявлена ​​/ выполнена в текстовом формате.

В то время как раздел 12.4.2 JLS объясняет, что статические блоки и статические переменные выполняются в текстовом порядке, в котором они появляются, раздел 8.3.3 JLS объясняет, когда вы можете ссылаться на что, и вы можете видеть, что условие The use is not on the left hand side of an assignment; терпит неудачу, позволяя вашему статическому блоку во втором примере ссылаться на статическую переменную, которая еще не была объявлена ​​/ выполнена в текстовом порядке.

Статики оцениваются в порядке их появления в программе.

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