Статические переменные инициализируются при загрузке класса.
Инстанционные переменные инициализируются при построении экземпляра. В большинстве случаев это происходит после того, как класс полностью инициализирован, но вопреки тому, что написал другой, это может произойти и при инициализации статических переменных. Например, довольно часто имеют статические константы для часто используемых экземпляров класса, например:
class Foo
{
private static final Foo FOO_BAR = new Foo("bar");
private static final Foo FOO_BAZ = new Foo("baz");
private final String name;
public Foo(String n)
{
name = n;
}
[...]
}
Здесь имя в первую очередь инициализируется «бар» перед FOO_BAZ инициализируется.
+1 Был готов опубликовать то же самое. – mikej
спасибо Dav, но когда происходит «загрузка класса»? после компиляции или когда я хочу сделать экземпляр из класса? –
@ M.H: ваши классы загружаются во время выполнения в первый раз, когда вы пытаетесь его использовать, или если вы явно указали виртуальной машине на загрузку. В это время инициализируется статический материал. Некоторые из значений, возможно, были встроены компилятором, если они могут быть определены во время компиляции. –