type - java new with generics




Java-метод, выполненный до конструктора по умолчанию (4)

Всякий раз, когда вы создаете экземпляр экземпляра класса, сначала инициализируются переменные, за которыми следует выполнение Constructor

Ссылка: инициализируются ли поля до того, как код конструктора запущен на Java?

На этот вопрос уже есть ответ:

Я изучаю java и случайно попадал в следующий код, где по умолчанию выполняется конструктор по умолчанию.

public class ChkCons {

    int var = getVal();

    ChkCons() {
        System.out.println("I'm Default Constructor.");
    }

    public int getVal() {
        System.out.println("I'm in Method.");
        return 10;
    }

    public static void main(String[] args) {

        ChkCons c = new ChkCons();

    }

}

ВЫХОД :

I'm in Method.
I'm Default Constructor.

Может кто-нибудь объяснить мне, почему это произошло?

Благодарю.


Конструктор вызывается до метода. Выполнение метода происходит после того, что является частью создания объекта, в котором вычисляются переменные экземпляра. Это может быть лучше понято из следующего кода.

class SuperClass{
    SuperClass(){
        System.out.println("Super constructor");
    }
}
public class ChkCons extends SuperClass{

    int var = getVal();

    ChkCons() {
        System.out.println("I'm Default Constructor.");
    }

    public int getVal() {
        System.out.println("I'm in Method.");
        return 10;
    }

    public static void main(String[] args) {

        ChkCons c = new ChkCons();

    }

}

Вышеприведенный код имеет следующий вывод

Super constructor
I'm in Method.
I'm Default Constructor.

Здесь компилятор автоматически добавляет super(); как первый оператор в конструкторе ChkCons() , и, следовательно, он вызывается до метода getVal() .


Экземпляры инициализации переменных экземпляра, такие как int var = getVal(); оцениваются после выполнения конструктора суперкласса, но до выполнения текущего тела конструктора этого класса.

Поэтому getVal() вызывается до того, как выполняется тело конструктора ChkCons .


Это потому, что вы инициализируете метод в поле, используя int var = getVal(); , поэтому он будет выполняться перед вызовом конструктора. Статический bloack имеет первый приоритет, он выполняется во время загрузки класса.







constructor