Являются ли в Java статические переменные класса, созданные во время выполнения или во время компиляции?
Никакие переменные не "создаются" во время компиляции в Java, если под созданным вами подразумеваетсявыделены и инициализированы.Все они создаются во время выполнения.Независимо от того, являются ли они static
или static final
, не имеют отношения к , когда они выделяются.
Но я бы ожидал, что конечная статическая переменная PI будетсоздан во время компиляции (поэтому он будет «встроен» в .class-файл), потому что я думаю, что это будет иметь лучшую производительность ...
Это не так, как это работает в Java.Когда файлы классов «скомпилированы», они в основном кодируются.Конечно, есть некоторая работа, которая выполняется, но очень большой процент того, что мы думаем о компиляции (в терминах таких языков, как C), происходит во время выполнения.Это особенно верно, когда мы смотрим на оптимизацию и встраивание.
Компилятор выполняет некоторую предварительную работу, такую как возможность предварительного вычисления значений полей (статических или экземпляров) заранее, если это возможно.Например, если вы определяете свое поле следующим образом, то умножения будут выполняться во время компиляции:
private long timeoutMillis = 10 * 24 * 3600 * 1000;
Это также верно для String
с, где компилятор будет добавлять константные строки вместе, если это возможно,Следующее не использует StringBuilder
во время выполнения, но вместо этого создаст один String
во время компиляции:
private static final String DEFAULT_HEADER = "A long headers that is " +
"broker into two lines\n";
Но все же, в обоих случаях, распределение и инициализация полей (long timeoutMillis
и String DEFAULT_HEADER
) выполняется во время выполнения.
Если во время выполнения будут созданы как статические, так и конечные статические переменные, в первой версии Main нет ни обеих статических переменных (экземпляров и PI)) класса MyClass.
В вашем примере поля static
(final
или нет) выделяются и инициализируются, когда класс загружен дляпервый раз.Таким образом, в ваших первых Main
полях instances
или PI
static
никогда не будет создано, как вы упомянули.В вашем втором примере.как только ссылка на MyClass
будет загружена, файл класса будет загружен и поля static
будут созданы.