Как работает конструктор при инициализации объекта?
Выход этого кода равен 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) {...}
.