При подготовке к сертификационному тесту Java я узнал, что статические блоки инициализации запускаются один раз при загрузке класса в порядке их появления в исходном коде, что блоки инициализации экземпляра запускаются каждый раз при создании экземпляра, а код в конструкторах запускается каждый раз. после этого создается экземпляр. Чтобы проверить это, я создал класс с некоторыми статическими блоками и блоками инициализации экземпляра и конструктором с материалами для печати. Все работало, как и ожидалось, за исключением того, что я думал, что «загружено» означает только во время выполнения, но я предполагаю, что это происходит, когда создается первый экземпляр, поскольку я вообще не получаю никакого вывода, если не создам хотя бы 1 экземпляр класса. Затем я попробовал то же самое с перечислением, и порядок был отключен. Во-первых, блоки инициализации запускаются один раз для каждого значения, которое имеет перечисление, когда перечисление впервые упоминается в коде, во-вторых, блоки инициализации, помеченные как статические, запускаются после того, что я предположил, были блоками инициализации экземпляра! Это противоположно тому, что я ожидал. Вот разбивка моих вопросов.
- Почему блоки инициализации, помеченные как статические, выполняются последними в перечислении?
- Может ли перечисление иметь блоки инициализации экземпляра?
- Почему блоки, которые я считал блоками инициализации экземпляра, запускаются только один раз при загрузке перечисления, а не каждый раз при ссылке на новое значение перечисления?
- Статические блоки инициализации класса запускаются, когда класс "загружается". Что значит загружен? Это происходит только один раз, когда объект создается в классе?
Спасибо! Это очень сбивает меня с толку.
public class EnumInit {
public static void main(String[] args) {
System.out.println(Color.RED.toString() + " Main");
MyInit myInit = new MyInit();
System.out.println(Color.BLUE.toString() + " Main");
MyInit mySecondInit = new MyInit();
}
}
enum Color {
RED, BLUE, GREEN;
String instanceVar = "Enum Instance Variable Text";
static { System.out.println("Enum Static init block 1"); }
{ System.out.println("Enum Instance init block 1"); }
static { System.out.println("Enum Static static init block 2"); }
Color() {
System.out.println(instanceVar);
System.out.println("Enum String Literal");
}
{ System.out.println("Enum Instance init block 2"); }
}
class MyInit {
String instanceVar = "Class Instance Variable Text";
static { System.out.println("Class Static init block 1"); }
{ System.out.println("Class Instance init block 1"); }
static { System.out.println("Class Static static init block 2"); }
MyInit() {
System.out.println(instanceVar);
System.out.println("Class String Literal");
}
{ System.out.println("Class Instance init block 2"); }
}