Как работает конструктор при инициализации объекта?

Выход этого кода равен 7 20.

Почему после этого печатается 7 и 20?

public class Television 
{
    private int channel = setChannel(7);
    public Television(int channel) 
    {
        this.channel = channel;
        System.out.print(channel +"");
    }

    public int setChannel(int channel) 
    {
        this.channel = channel;
        System.out.print(channel + "");
        return channel;
    }

    public static void main(String args[])
    {
        new Television(20);
    }
}

Ответы

Ответ 1

Когда объект создается, его поля создаются. У вас есть член класса:

private int channel = setChannel(7);

Когда вы выполните:

new Television(20);

Инициализируется поле и setChannel вызывается перед вызовом конструктора, и оттуда печатается 7.

Все поля объекта создаются и заполняются предоставленными значениями (или значениями по умолчанию, если значение не указано). Вы можете думать об этом как о подготовке экземпляра. После того, как эти элементы готовы и инициализированы, вызывается конструктор.

Подробнее см. JLS.

Ответ 2

Потому что порядок инициализации в Java. Короче говоря:

  • Статические элементы и блоки.
  • Элементы и блоки экземпляров
  • Тело конструктора

Ответ 3

Ответ доступен в Спецификации языка Java:

Прежде чем в результате возвращается ссылка на вновь созданный объект, указанный конструктор обрабатывается для инициализации нового объекта с помощью следующей процедуры:

  • Назначьте аргументы конструктора новым созданным переменным параметра для этого вызова конструктора.

  • Если этот конструктор начинается с явного вызова конструктора (§8.8.7.1) другого конструктора в том же классе (используя это)...

  • ... Если этот конструктор для класса, отличного от Object, то этот конструктор начнется с явного или неявного вызова конструктора суперкласса (с помощью супер)...

  • Выполнить инициализаторы экземпляра и инициализаторы переменных экземпляра для этого класса, присваивая значения инициализаторов переменной экземпляра соответствующим переменным экземпляра в порядке слева направо, в котором они появляются текст в исходном коде для класса. Если выполнение любого из этих инициализаторов приводит к исключению, то никакие новые инициализаторы не обрабатываются, и эта процедура завершается внезапно с тем же исключением. В противном случае перейдите к шагу 5.

  • Выполнить оставшуюся часть этого конструктора. Если это выполнение завершается внезапно, то эта процедура завершается внезапно по той же причине. В противном случае эта процедура выполняется нормально.

Подводя итог, если конструктор не вызывает другой конструктор (используя this), и он не вызывает конструктор суперкласса (используя super), тогда переменные экземпляра инициализируются перед выполнением кода конструктора.

Ответ 4

Сначала приватное поле инициализируется, а затем вызывается конструктор.

Таким образом, выход равен 7 20.

В java при создании экземпляра нового объекта произошел следующий процесс:

  • Все частные поля объекта оцениваются.
  • Тогда и только тогда вызывается конструктор.

Ответ 5

Вы инициализируете свой "канал канала" вне класса construsctor, поэтому перед этим вызывается эта инициализация.

Это то, что добавляется, когда вы вызываете new Television(20):

1/this.channel set to 7 (init step)
2/Calling constructor
3/this.chennel set to 20 (constructor code)

Ответ 6

Поскольку setChannel в вашей инициализации канала переменной вызывается сначала для инициализации класса и метода в конструкторе после этого.

Ответ 7

Когда вы создаете экземпляр объекта, сначала создаете его элементы данных (т.е. сначала эта строка выполняется private int channel = setChannel(7);), и только тогда создатель создает объект public Television(int channel) {...}.