Я отвечу: «когда эта статическая c переменная инициализируется»
Я испытал, что Java классы загружаются, когда они нужны. Например, если вы никогда его не используете (например, вы никогда не ссылаетесь на переменную или не вызываете функцию / конструктор), JVM не инициализирует класс.
Итак, когда вы вызываете Runtime.getRuntime () , затем инициализируется класс и поля stati c.
Вы также можете протестировать его, используя блоки stati c с этим кодом
public class MainClass {
public static void main(String[] args) {
System.out.println("program starts");
Runtime.getRuntime();
System.out.println("programs end");
}
}
public class Runtime {
//When is this private member initalised ??
private static Runtime currentRuntime = new Runtime();
static {
System.out.println("when this is called the class is beeing initialized");
System.out.println("is currentRuntime null? -> " + (currentRuntime == null));
}
public static Runtime getRuntime() {
System.out.println("getRuntime is executed");
return currentRuntime;
}
}
Это что я получаю на консоли
program starts
when this is called the class is beeing initialized
is currentRuntime null? -> false
getRuntime is called
programs end
Что это значит? Что класс Runtime (и его поля) не инициализируется перед запуском main (), но он инициализируется, когда Runtime запрашивается .
Кроме того, stati * Блок 1029 * вызывается, когда currentRuntime не является нулевым, поэтому он уже инициализирован (помните, что Java идет сверху вниз).
Итак, он инициализируется, когда Runtime.getRuntime () вызывается, но перед его выполнением