Хочу добавить, что статические переменные и статические инициализаторы выполняются в порядке появления во время загрузки класса. Таким образом, если ваш статический инициализатор использует некоторую статическую переменную, он должен быть инициализирован перед определенным статическим блоком, например
final static String JDBC_DRIVER = getJdbcDriver( );
static
{
try
{
Class.forName(JDBC_DRIVER);
}
catch ( ClassNotFoundException exception )
{
log.error( "ClassNotFoundException " + exception.getMessage( ) );
}
}
В этом примере getJdbcDriver
будет выполнено перед статическим инициализатором. Кроме того, в классе может быть более 1 статического инициализатора. Еще раз они выполняются в порядке появления.
Я также хочу упомянуть о существовании здесь инициализаторов экземпляров, поскольку они удивляют, когда их видят впервые. Они выглядят как блок кода внутри тела класса, вот так.
class MyClass
{
final int intVar;
{
intVar = 1;
}
}
В общем случае их использование несколько ненужно из-за конструктора, но они полезны для реализации версии замыканий Java.