Java - Почему блок экземпляра вызывается после конструктора или порядка в конструкторе? - PullRequest
0 голосов
/ 20 декабря 2018

Поскольку мы знаем, что instance block вызывается перед constructor. Технические характеристики , Ответ переполнения стека и т. Д.

Итак, результат, который мы ожидаем из приведенного ниже кода:

class Test{
    static { System.out.println("Static Block"); }
    { System.out.println("Instance Block"); }
    Test(){
        System.out.println("Constructor Body");
        { System.out.println("Constructor Instance Block"); }
    }
}
class TestApp{
    public static void main(String[] args){
        new Test();
    }
} 

должен быть:

Static Block
Instance Block

Constructor Instance Block
Constructor Body

Тогда почему я получаю следующий вывод:

Static Block
Instance Block

Constructor Body
Constructor Instance Block

Но если я изменю порядок операторов в constructor, например:

class Test{
    static { System.out.println("Static Block"); }
    { System.out.println("Instance Block"); }
    Test(){
        { System.out.println("Constructor Instance Block"); }
        System.out.println("Constructor Body");
    }
}

Затем он выводит ожидаемый результат, но это не должно быть так, потому что в документах говорится, что instance block вызывается до constructor.

Почему instance block вызывается после тела constructor или мыМожно сказать, почему это называется по порядку?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

static initializers и instance initializers соответствуют классу и его созданию.См .: Статический блок против блока инициализатора в Java? Вот почему он должен быть помещен в тело класса.

В противном случае (например, в теле метода) ваш {...} будет считаться блоком инструкций (как на языке C).Если вы попытаетесь поместить конструкцию static {...} в другом месте (не в теле класса), вы получите ошибку компиляции.

Надеюсь, вам помог ответ!

0 голосов
/ 20 декабря 2018

{ System.out.println("Constructor Instance Block"); } - это не instance block, а еще одна общая строка кода в методе (в вашем случае, конструктор).Так что извините ПОСЛЕ System.out.println("Constructor Body");, что естественно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...