Статический инициализатор в Java — это блок кода, заключённый в фигурные скобки и предваряемый ключевым словом static. Такой блок исполняется один раз при загрузке класса в JVM, до создания любых экземпляров этого класса и до вызова любых статических методов. Его основная задача — выполнение сложной инициализации статических переменных.
public class Example { static int staticValue; static { staticValue = 10; // Сложная логика инициализации System.out.println("Статический блок инициализации выполнен"); } }
Статический инициализатор особенно полезен, когда статическая переменная зависит от других ресурсов или требует обработки при загрузке класса.
Вопрос: "В каком порядке выполняются статические блоки и инициализация статических переменных в Java, если порядок их объявления различен в классе?"
Правильный ответ: Все статические переменные и блоки инициализируются в том порядке, в котором они объявлены в исходном тексте класса (сверху вниз). Если статическая переменная используется в статическом блоке, расположенном выше её определения, вызовет ошибку компиляции или может привести к неожиданному значению.
class Order { static { System.out.println(X); // значение по умолчанию: 0 } static int X = 100; static { System.out.println(X); // 100 } }
История
На крупном проекте инициализировали логгер через статический блок, однако при разнесении объявления переменных и статических блоков местами, переменная логгера осталась неинициализированной к моменту вызова, что привело к NullPointerException при логировании во время загрузки класса.
История
При разработке JDBC утилиты инициализация драйверов производилась в статическом блоке. Один из разработчиков перенёс объявление String переменной, содержащей путь, ниже статического блока, и код перестал корректно подключаться к БД — путь был null.
История
В распределённой системе возникли проблемы с загрузкой данных конфигурации: часть логики была реализована через статические блоки в нескольких классах с взаимными ссылками, что привело к циклическим инициализациям и StackOverflowError во время старта приложения, из-за неправильной организации статических блоков и депенденси.