статический объект против конструктора, почему конструктор выполняется первым и назначается в статической ссылочной переменной - PullRequest
0 голосов
/ 18 января 2019
public class testing {
    static testing tmp = new testing();

    testing() {
        System.out.println("You are good");
    }

    public static void main(String... str) {

    }
}

В вышеприведенном коде напечатано «Вы хороши». Но я хочу знать, почему это произошло, поскольку конструктор не является статическим методом, а статические переменные выполняются раньше, чем статические методы.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Объявление статической переменной tmp использует конструктор для инициализации нового экземпляра testing. Неважно, что конструктор технически является нестатическим (экземплярным) методом, если его вызывают внутри объявления статической переменной.

Точнее, статические переменные класса инициализируются в какой-то момент при загрузке определения класса. Это полностью независимо от каких-либо вызовов статического или экземпляра метода позже в коде.

0 голосов
/ 18 января 2019

Статические переменные инициализируются при первой загрузке класса. В вашем случае статическая переменная ссылается на конструктор того же класса, поэтому вызывается cunstructor. Который затем печатает заявление System.out.println("You are good");.
Аналогичный вопрос задается здесь

Выписка не будет напечатана, если:

// 1. Non-static declaration
testing tmp = new testing();

// 2. Initialization skipped - no call to constructor
testing tmp2 = null; //new testing();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...