Когда загружается статическая переменная, время выполнения или время компиляции? Может кто-нибудь объяснить это.
Я очень благодарен за помощь.
Спасибо.
Когда загружается статическая переменная, время выполнения или время компиляции? Может кто-нибудь объяснить это.
Я очень благодарен за помощь.
Спасибо.
Они загружаются во время выполнения.
Статичность означает, что переменная принадлежит классу, а не экземплярам класса. Таким образом, существует только одно значение каждой статической переменной, а не n значений, если у вас есть n экземпляров класса.
Компилятор оптимизирует встроенные статические окончательные поля, вставляя значение в байт-код вместо вычисления значения во время выполнения.
Когда вы запускаете JVM и загружаете класс в первый раз (это делается загрузчиком классов при первом обращении к классу) любые статические блоки или поля загружаются в JVM и становятся доступными.
Демонстрация:
public class StaticDemo {
// a static initialization block, executed once when the class is loaded
static {
System.out.println("Class StaticDemo loading...");
}
// a constant
static final long ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000;
// a static field
static int instanceCounter;
// a second static initialization block
// static members are processed in the order they appear in the class
static {
// we can now acces the static fields initialized above
System.out.println("ONE_DAY_IN_MILLIS=" + ONE_DAY_IN_MILLIS
+ " instanceCounter=" + instanceCounter);
}
// an instance initialization block
// instance blocks are executed each time a class instance is created,
// after the parent constructor, but before any own constructors (as remarked by Ahmed Hegazy)
{
StaticDemo.instanceCounter++;
System.out.println("instanceCounter=" + instanceCounter);
}
public static void main(String[] args) {
System.out.println("Starting StaticDemo");
new StaticDemo();
new StaticDemo();
new StaticDemo();
}
static {
System.out.println("Class StaticDemo loaded");
}
}
Вывод:
Class StaticDemo loading...
ONE_DAY_IN_MILLIS=86400000 instanceCounter=0
Class StaticDemo loaded
Starting StaticDemo
instanceCounter=1
instanceCounter=2
instanceCounter=3
Обратите внимание, что "Starting StaticDemo" не отображается в качестве первой строки вывода. Это связано с тем, что класс должен быть загружен до, основной метод может быть выполнен, что означает, что все статические поля и блоки обрабатываются в порядке.
время выполнения при загрузке класса. - Посмотрите на инициализацию
Статические поля загружаются при загрузке класса. Обычно это происходит, когда создается файл-объект класса, но он может быть раньше, если класс используется другим способом.
Статический инициализатор является потокобезопасным, и вы можете безопасно обращаться к классу в нескольких потоках. Это полезно как способ создания потокового сейфа, без необходимости использовать блокировку.
Примечание. Класс может быть загружен (и его статический цикл инициализации) более одного раза, если используются несколько загрузчиков классов. Как правило, загрузка одного и того же класса в нескольких загрузчиках классов может сбивать с толку и его можно избежать, но она поддерживается и работает.
Как бы вы загрузили переменную во время компиляции? Переменная инициализируется при загрузке соответствующего класса. См. JVMS.
Загрузка выполняется во время выполнения. Все загружается во время выполнения.
Когда вы вводите java ClassName
, тогда класс загружается в JVM со статическими переменными, поэтому вам не нужен объект для него.
Где в качестве переменной экземпляра, загружаемой JVM при создании объекта.