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
В основном то, что произошло то, что static final
комбинация на примитивах и струнных заставляют их быть встраиваемый компилятором, и это могло бы предотвратить статический блок инициализации от исполнения, так как класс никогда не загружается загрузчиком классов, так как a
aa
был решен во время компиляции
javap
Поскольку ваши переменные с ключевыми словами static final
являются константами compiled-time, которые не запускают загрузку класса, содержащего это поле.
Попробуйте запустить этот код со static final
окончанием для переменной a
System.out.println(a.a)
a var = new a();
так как вы можете видеть, что вывод будет
5
hi
Статический блок не запускается, когда вызывается, но в тот момент, когда создается экземпляр класса, он запускается. Это может быть вызвано любым из них:
Вопрос, очень похожий на ваш, который может быть полезен: статический блок в Java не выполнен
static
ы должно быть инициализировано при загрузке класса , и он должен быть загружаемый по b
ссылаться на него. Однако, как объясняет @endriu_l в своем ответе, компилятор вставляет значение поля aa
в b
и поэтому класс a
никогда не загружается, то есть static
блок никогда не выполняется
final
, вы не можете изменить это значение снова, другими словами, вы не можете переназначить переменнуюa
чтобы получить новое значение, отличное от int5
. Вы получите ошибку компилятора, если попытаетесь это сделать.