когда загружается статическая переменная в java, во время выполнения или во время компиляции?

Если вы используете DecimalFormat для преобразования double в String, это очень просто:

DecimalFormat formatter = new DecimalFormat("0.0##");
formatter.setRoundingMode(RoundingMode.HALF_UP);

double num = 1.234567;
return formatter.format(num);

Есть несколько значений RoundingMode для выбора, в зависимости от поведения Вы требуете.

30
задан suprasad 3 December 2010 в 08:40
поделиться

3 ответа

Загрузка является операцией во время выполнения. Все загружается во время выполнения.

0
ответ дан 27 November 2019 в 23:02
поделиться

Компилятор оптимизирует встроенные поля static final , встраивая значение в байт-код вместо вычисления значения во время выполнения.

Когда вы запускаете 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

Обратите внимание, что «Запуск StaticDemo» не отображается в качестве первой строки вывода. Это связано с тем, что класс должен быть загружен до , и основной метод может быть выполнен, что означает, что все статические поля и блоки обрабатываются по порядку.

81
ответ дан 27 November 2019 в 23:02
поделиться

Статические поля загружаются при загрузке класса. Обычно это происходит при создании файлового объекта класса, но это может произойти раньше, если класс используется другим способом.

Статический инициализатор является поточно-ориентированным, и вы можете безопасно обращаться к классу в нескольких потоках. Это полезно как способ создания синглтона, безопасного для многопоточного режима, без использования блокировки.

Примечание: класс может быть загружен (и его блок статической инициализации запущен) более одного раза, если используется несколько загрузчиков классов. Как правило, загрузка одного и того же класса в нескольких загрузчиках классов может сбивать с толку и избегать этого, но это поддерживается и работает.

3
ответ дан 27 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: