По JLS:
Класс или тип интерфейса T будет инициализирован непосредственно перед первое вхождение любого из следующего:
T - это класс и создается экземпляр T.
Также он говорит,
Инициализация класса состоит из выполнения его статического инициализаторы и инициализаторы для статических полей (переменные класса) объявленный в классе
Я выложу две точки из этого
- Инициализация классов состоит из выполнения статических инициализаторов
- Инициализация класса происходит, если класс создан.
Теперь,
Я предполагаю, что когда я создаю объект класса Test в своем собственном (Test own) статическом инициализаторе, он должен бросать мне переполнение стека, так как он должен вызывать себя повторно, потому что в соответствии с вышеприведенными двумя точками инициализация класса должна инициализироваться класс и блок инициализации имеют экземпляр класса. Переполнение стека происходит, когда я создаю экземпляр класса в своем собственном конструкторе или в его собственных инициализаторах экземпляра.
Например,
public class Test {
static{
System.out.println("static test");
new Test();
}
{
//new Test(); // This will give a stack overflow
System.out.println("intializer");
}
public Test(){
//new Test(); // This will give a stack overflow
System.out.println("constructor");
}
public static void main(String[] args) {
}
}
Однако результат - это нечто иное.
Результат:
статический тестintializer Конструктор
Либо я слишком запутался в понимании инициализации класса, либо я извиняюсь, если мне не хватает чего-то очень очевидного здесь и ценю вашу помощь.