Почему статический инициализатор не выполняется, если указанное статическое поле является окончательным [duplicate]

1
class a
{
    static final  int a =5;
    static {
        System.out.println("hi");

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

}

Почему статический блок не работает, а выход - только

5

тогда как если я удалю конечное ключевое слово из переменной класса, статический блок будет выполнен, а результат будет

hi 
5
  • 0
    Как только вы присваиваете значение примитивному типу данных, имеющему модификатор final , вы не можете изменить это значение снова, другими словами, вы не можете переназначить переменную a чтобы получить новое значение, отличное от int 5 . Вы получите ошибку компилятора, если попытаетесь это сделать.
  • 1
    На самом деле это хороший вопрос, название которого немного вводит в заблуждение, что приводит к отрицательным результатам.
Показать ещё 3 комментария
Теги:
static
final

2 ответа

5
Лучший ответ

В основном то, что произошло то, что static final комбинация на примитивах и струнных заставляют их быть встраиваемый компилятором, и это могло бы предотвратить статический блок инициализации от исполнения, так как класс никогда не загружается загрузчиком классов, так как a aa был решен во время компиляции

  • 1
    Хорошее место, вы можете увидеть переменную встроенной, если вы перечислите байт-код с помощью javap
4

Поскольку ваши переменные с ключевыми словами static final являются константами compiled-time, которые не запускают загрузку класса, содержащего это поле.

Попробуйте запустить этот код со static final окончанием для переменной a

System.out.println(a.a)
a var = new a();

так как вы можете видеть, что вывод будет

5
hi

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

  • создается экземпляр класса,
  • вызывается статический метод класса,
  • статическое поле класса назначается,
  • используется непостоянное статическое поле или
  • для класса верхнего уровня выполняется оператор утверждения, лексически вложенный в класс.

Вопрос, очень похожий на ваш, который может быть полезен: статический блок в Java не выполнен

  • 0
    Я не думаю, что это строго правильно. В static ы должно быть инициализировано при загрузке класса , и он должен быть загружаемый по b ссылаться на него. Однако, как объясняет @endriu_l в своем ответе, компилятор вставляет значение поля aa в b и поэтому класс a никогда не загружается, то есть static блок никогда не выполняется

Ещё вопросы

Сообщество Overcoder
Наверх
Меню