When are static fields initialized? If I never instantiate a class, but I access a static field, are ALL the static blocks and private static methods used to instantiate private static fields called (in order) at that instant?
What if I call a static method? Does it also run all the static blocks? Before the method?
Static fields are initialized during the initialization "phase" of the class loading (loading, linking and initialization) that includes static initializers and initializations of its static fields. The static initializers are executed in a textual order as defined in the class.
Consider the example:
The Test.b prints
null
because when thesayHello
was called in static scope, the static variablea
was not initialized.A class's static initialization normally happens immediately before the first time one of the following events occur:
for a top-level class, an assert statement lexically nested within the class is executed1.See JLS 12.4.1.
It is also possible to force a class to initialize (if it hasn't already initialized) by using
Class.forName(fqn, true, classLoader)
or the short formClass.forName(fqn)
1 - The final bullet point was present in the JLS for Java 6 through Java 8, but it was apparently a mistake in the specification. It was finally corrected in the Java 9 JLS: see source.
Yes, all static initializers are run before you access class first time. If it was any other way, I would call it a bug.