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