В чем разница, если для инициализации полей можно использовать конструткор?
Alexander
17 уровень
В чем отличия initialize от конструкторов?
Решен
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
10 апреля 2019, 08:26
С точки зрения того, насколько будут инициализированы поля (а они либо инициализированы, либо нет :) ), разницы нет никакой. Разница в целом заключается в подходе к тому, как ты создаешь объекты, и как позволяешь с ними работать другим классам. Во-первых конструкторы и инициализирующие методы могут иметь разные модификаторы доступа, но это, я думаю, очевидно. Самое основное заключается вот в чем.
Как ты наверняка знаешь, если ты добавляешь конструктор с параметрами
, то твой конструктор по-умолчанию (который без параметров) перестает работать, если ты его явно не пропишешь в этом классе, т.е. ты не сможешь создать просто объект new MyClass(). Что это дает? А это дает то, что ты тем самым создаешь у объектов этого класса обязательные поля, т.е. поля field1 и field2 будут заполнены у всех объектов этого класса. Ну, разумеется, если у тебя есть еще один конструктор, инициализирующий другие поля, то будут заполнены либо те, либо эти, но какие-то из них точно будут заполнены.
Инициализаторы этого не гарантируют. Это просто инструмент, позволяющий заполнить какие-то из полей. Например, чтобы соседний класс мог заполнять поля каким-то из объектов этого класса.
Короткое резюме. Используя конструктор, можно добиться того, чтобы поля класса были обязательными для заполнения. +26
RiccioMaster
12 апреля 2019, 07:40
Про конструктор все понятно. В него ведь можно не только обязательные поля встроить, но и проверку этих полей:
А вот про инициализатор не очень. Что мешает написать:
0
hidden #598481
12 апреля 2019, 08:42
А где у тебя тут метод initialize? У тебя и там и там конструктор.
Я не понял твоего вопроса, если честно. Я лишь говорил о том, что конструктор выполнится именно при создании объекта, а это значит, что можно гарантировать создание объекта с заполненными полями. А метод может быть вызван в произвольном месте, т.е. использование метода для заполнения полей не гарантирует, что поля всегда заполнены.
+2
Александр Осипян
14 февраля 2020, 18:34
Хм Я вот что понял
Конструктор вызывается 1 раз при создании экз. класса.
Несколько вариантов конструкторов для одного класса позволяют благодаря перегрузке конструкторов, компилятор выбирает тот, который соответствует тем данным, что были введены.
но используя конструкторы мы используем сеттеры и геттеры и можем также вносить изменение в экземпляр как и при блоках инициализации.
и в конструкторе и в методе "блок инициализация" происходят очень похожий функционал.
Отсюда вопрос - что мы упускаем?
+1
VIKTOR NEZHELSKIYExpert
9 апреля 2019, 17:53
Конструктор выполняет действия, необходимые для создания экземпляра объект какого-либо класса. А инициализация - это присвоение значения для поля класса. Это поле должно быть статическим, и инициализация будет присваивать значение одному полю для всех объектов этого класса, а не полю каждого экземпляра этого класса.
+8
Alexander
10 апреля 2019, 01:22
просто в задачах все примеры даются на инициализацию параметров текущего объекта
0
VIKTOR NEZHELSKIYExpert
10 апреля 2019, 05:14
Тогда данный вопрос надо смотреть в контексте конкретной задачи. Возможно, задача для того и дана, что бы научить делать инициализацию и создавать конструкторы именно таким способом, как требуется по условию задачи. Немало важно научиться точно понимать и реализовывать требования условия задачи.
0
Артем
21 мая 2021, 14:37
А есть ли смысл присваивать значение одному полю для всех объектов этого класса? В этой лекции (https://javarush.com/quests/lectures/questsyntax.level05.lecture06) в качестве примера используется класс MyFile. Объекты этого класса это файлы. Если с помощью инициализации у всех объектов (то есть файлов) появятся одинаковые имена, то зачем это нужно?
+3