Статические переменные инициализируются при загрузке класса.
Переменные экземпляра инициализируются при создании экземпляра. В большинстве случаев это происходит после полной инициализации класса, но в отличие от написанного другими, это также может происходить при инициализации статических переменных. Например, довольно часто иметь статические константы для часто используемых экземпляров класса, например:
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;
}
[...]
}
Здесь имя в первом случае инициализируется как «bar» до инициализации FOO_BAZ.