Конструктор по умолчанию выполняется перед блоком Stati c в java - PullRequest
1 голос
/ 21 марта 2020

Когда мы загружаем класс в java, сначала выполняется stati c block , а затем конструктор по умолчанию . но в приведенном ниже коде, Как я заметил, конструктор по умолчанию выполняется перед блоком stati c.

    public class Hello {

    private static Hello hello = new Hello();

    public Hello() {
        System.out.println("Hello Default Constructor");
    }

    static {
        System.out.println("Hello Static Block");
    }

    public static Hello createHelloInstance() {
        return hello;
    }
}

Основной класс:

   public class MainTest {

        public static void main(String a[])
        {
            Hello.createHelloInstance();
        }
    }

Вывод:

Hello Default Constructor
Hello Static Block

Мне нужно знать фундаментальную концепцию этого. что это так происходит. ? Может ли кто-нибудь помочь мне понять, что за этим стоит.

Ответы [ 3 ]

3 голосов
/ 21 марта 2020

Точно так же, как выражения инициализатора поля экземпляра вставляются в конструкторы, stati c выражения инициализатора поля вставляются в инициализатор stati c в порядке появления.

Итак

private static Hello hello = new Hello();

...

static {
    System.out.println("Hello Static Block");
}

Это эквивалент:

private static Hello hello;

...

static {
    hello = new Hello();
    System.out.println("Hello Static Block");
}
1 голос
/ 21 марта 2020

У вас есть элемент stati c (hello), который инициализируется вызовом new Hello(), который вызывает конструктор по умолчанию. Поскольку этот элемент объявлен перед блоком static, он будет инициализирован первым. Если вы переместите его после блока, блок будет выполнен первым:

public class Hello {
    static {
        System.out.println("Hello Static Block");
    }
    private static Hello hello = new Hello();

    // etc...
}

Или, что еще лучше, сделайте порядок явным, переместив инициализацию внутри блока.

public class Hello {
    private static Hello hello;
    static {
        System.out.println("Hello Static Block");
        hello = new Hello();
    }

    // etc...
}
0 голосов
/ 21 марта 2020

Да, но у вас есть эта строка кода:

private static Hello hello = new Hello();

, и именно поэтому у вас сначала выполняется конструктор. Stati c инициализаторы выполняются перед конструктором.

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