Блок основного класса в {{} 'никогда не выполняется - PullRequest
1 голос
/ 29 августа 2009

Рассмотрим следующий код: -

class Name {

    {System.out.println("hi");}

    public static void main(String[] args) {
        System.out.println(waffle());
    }

    static boolean waffle() {
        try {
            return true;
        } finally {
            return false;
        }
    }
}

Это никогда не выводит "привет". Почему это?

Ответы [ 3 ]

24 голосов
/ 29 августа 2009

Код в скобках - это инициализатор экземпляра .

С Спецификация языка Java, третье издание , Раздел 8.6 :

Инициализатор экземпляра, объявленный в класс выполняется, когда экземпляр класс создан (§15.9), как указано в §8.8.5.1.

Если класс Name выполняется, метод public static void main(String[]) вызывается виртуальной машиной Java, но класс Name не создается, поэтому код в инициализаторе экземпляра никогда не будет выполнен.

Существует также статический инициализатор , который по внешнему виду аналогичен инициализатору экземпляра, но имеет ключевое слово static впереди:

static {
    // Executed when a class is first accessed.
}

Опять же, с Спецификация языка Java, третье издание , Раздел 8.7 :

Любые статические инициализаторы, объявленные в класс выполняется, когда класс инициализирован и вместе с любым инициализаторы поля (§8.3.2) для класса переменные, могут быть использованы для инициализации переменные класса (§12.4).

Страница Инициализирующие поля из Учебные руководства по Java также содержат информацию о статических и экземплярах инициализирующих блоков.

1 голос
/ 29 августа 2009

Блок должен быть объявлен статическим, чтобы запустить его, то есть static {System.out.println ("hi");}

1 голос
/ 29 августа 2009

Я думаю, что он активируется только при создании экземпляра. Попробуйте запустить его как статический {...}

...