Для чего нужен конструктор

от admin

Конструкторы в Java

Конструктор успешно присвоил нужные значения. Ты, возможно, заметил, что конструктор очень похож на обычный метод! Так оно и есть: конструктор — это метод, только немного специфичный 🙂 Так же как в метод, в наш конструктор мы передали параметры. И так же как вызов метода, вызов конструктора не сработает, если их не указать: Видишь, конструктор сделал то, чего мы пытались добиться. Теперь нельзя создать машину без скорости или без модели! На этом сходство конструкторов и методов не заканчивается. Так же, как и методы, конструкторы можно перегружать. Представь, что у тебя дома живут 2 кота. Одного из них ты взял еще котенком, а второго ты принес домой с улицы уже взрослым и не знаешь точно, сколько ему лет. Значит, наша программа должна уметь создавать котов двух видов — с именем и возрастом для первого кота, и только с именем — для второго кота. Для этого мы перегрузим конструктор: К изначальному конструктору с параметрами “имя” и “возраст” мы добавили еще один, только с именем. Точно так же мы перегружали методы в прошлых уроках. Теперь мы успешно можем создать оба варианта котов 🙂 Помнишь, в начале лекции мы говорили, что ты уже пользовался конструкторами, только сам не замечал этого? Так и есть. Дело в том, что у каждого класса в Java есть так называемый конструктор по умолчанию. У него нет никаких аргументов, но он срабатывает каждый раз при создании любого объекта любого класса. На первый взгляд это незаметно. Ну создали объект и создали, где тут работа конструктора? Чтобы это увидеть, давай прямо руками напишем для класса Cat пустой конструктор, а внутри него выведем какую-нибудь фразу в консоль. Если она выведется, значит конструктор отработал. Вывод в консоль:

Зачем нужен конструктор? - 3

Вот и подтверждение! Конструктор по умолчанию всегда незримо присутствует в твоих классах. Но тебе нужно знать еще одну его особенность. Дефолтный конструктор исчезает из класса, когда ты создаешь какой-то конструктор с аргументами. Доказательство этого, на самом деле, мы уже видели выше. Вот в этом коде: Мы не смогли создать кота без имени и возраста, потому что определили конструктор для Cat : строка + число. Дефолтный конструктор сразу после этого исчез из класса. Поэтому обязательно запомни: если тебе в твоем классе нужно несколько конструкторов, включая пустой, его нужно создать отдельно. Например, мы создаем программу для ветеринарной клиники. Наша клиника хочет делать добрые дела и помогать бездомным котикам, про которых мы не знаем ни имени, ни возраста. Тогда наш код должен выглядеть так: Теперь, когда мы явно прописали конструктор по умолчанию, мы можем создавать котов обоих типов 🙂 Для конструктора (как и для любого метода) очень важен порядок следования аргументов. Поменяем в нашем конструкторе аргументы имени и возраста местами. Ошибка! Конструктор четко описывает: при создании объекта Cat ему должны быть переданы число и строка, именно в таком порядке. Поэтому наш код не срабатывает. Обязательно запомни это и учитывай при создании своих собственных классов: Это два абсолютно разных конструктора! Если выразить в одном предложении ответ на вопрос “Зачем нужен конструктор?”, можно сказать: для того, чтобы объекты всегда находились в правильном состоянии. Когда ты используешь конструкторы, все твои переменные будут корректно проинициализированы, и в программе не будет машин со скоростью 0 и прочих “неправильных” объектов. Их использование очень выгодно прежде всего для самого программиста. Если ты будешь инициализировать поля самостоятельно, велик риск что-нибудь пропустить и ошибиться. А с конструктором такого не будет: если ты передал в него не все требуемые аргументы или перепутал их типы, компилятор сразу же выдаст ошибку. Отдельно стоит сказать о том, что внутрь конструктора не стоит помещать логику твоей программы. Для этого в твоем распоряжении есть методы, в которых ты можешь описать весь нужный тебе функционал. Давай посмотрим, почему логика в конструкторе — это плохая идея: У нас есть класс CarFactory , описывающий фабрику по производству автомобилей. Внутри конструктора мы инициализируем все поля, и сюда же помещаем логику: выводим в консоль некоторую информацию о фабрике. Казалось бы — ничего плохого в этом нет, программа прекрасно отработала. Вывод в консоль:

Конструктор и деструктор классов в C++

Начнем с того, что когда мы создаем элементы (переменные) класса, мы не можем присвоить им значения в самом определении класса. Компилятор выдаст ошибку. Поэтому нам необходимо создавать отдельный метод (так называемую set-функцию) класса, с помощью которого и будет происходить инициализация элементов. При этом, если необходимо создать, к примеру, 20 объектов класса, то чтобы инициализировать элементы потребуется 20 раз вызвать set-функции.

Тут нам как раз сможет помочь конструктор класса. Кстати, конструктор (от слова construct — создавать) – это специальный метод класса, который предназначен для инициализации элементов класса некоторыми начальными значениями.

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

  1. конструктор и деструктор, мы всегда объявляем в разделе public ;
  2. при объявлении конструктора, тип данных возвращаемого значения не указывается, в том числе — void . ;
  3. у деструктора также нет типа данных для возвращаемого значения, к тому же деструктору нельзя передавать никаких параметров;
  4. имя класса и конструктора должно быть идентично;
  5. имя деструктора идентично имени конструктора, но с приставкой

Сразу хочу привести пример, который доступно покажет, как работает конструктор:

Результат работы программы:

Как видно из результата работы программы, конструктор срабатывает сразу, при создании объектов класса, поэтому, явно вызывать конструктор не нужно, он сам «приходит» 🙂

Хочется еще добавить, что, как и обычным функциям, мы можем передавать конструктору параметры. Через параметры, конструктору можно передавать любые данные, которые будут необходимы при инициализации объектов класса.

Рассмотрим еще один пример, это все та же программа, только в код внесены некоторые изменения. Тут же покажем принцип работы деструктора:

Смотрим результат работы программы :

Деструктор срабатывает в тот момент, когда завершается работа программы и уничтожаются все данные. Мы его не вызывали – он сработал сам. Как видно, он сработал 2 раза, так как и конструктор. Уже от себя добавлю, что, в первую очередь, он удалил второй созданный объект (где a = 200, b = 200), а затем первый (где a = 100, b = 100). «Последним пришёл — первым вышел».

Name already in use

job4j / interview_questions / OOP.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

1. Что такое ООП?

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

Важным элементом ООП является абстракция. Эффективным средством применения абстракции служат иерархические конструкции. Это позволяет упрощать понимание сложных систем, разбивая их на более управляемые части.

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

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

2. Базовые концепции ООП?

Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Для Java корректно будет говорить, что инкапсуляция это «сокрытие реализации».

Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом.

Полиморфизм — свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Абстракция — выделение значимой информации и исключение из рассмотрения незначимой.

3. Укажите из каких элементов состоит класс?

Класс состоит из полей (атрибуты) и методов (функции для работы с этими полями). Поле (атрибут) класса — это характеристика объекта, содержит его состояние. Например для фигуры это может быть название, площадь, периметр.

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

локальные переменные — определены внутри методов, конструкторов или иных блоков кода (циклы, итераторы и т.д.) Они объявляются и уничтожаются по завершении работы метода.

переменные экземпляра — доступны в пределах класса и из любого метода, конструктора или иных блоков кода конкретного класса (циклы, итераторы и т.д.).

статические переменные — объявляются в классе вне любого метода с помощью ключевого слова static .

4. Что такое конструктор Типы конструкторов?

Конструктор — это специальный метод, который вызывается при создании нового объекта (всегда вызывается совместно с операцией new ).

Конструктор нужен для автоматической инициализации переменных, т.е. он инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения void .

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

конструктор с параметрами или явный.

5. Можно ли наследовать конструктор?

Нет, но ему можно передать аргументы с помощью super .

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

6. Что такое перегрузка конструктора?

Перегрузка конструктора — это создание конструкторов с другим набором аргументов (как по количеству, так и по порядку следования).

Перегрузка конструктора позволяет установить различные способы начальной инициализации объектов класса.

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

7. Что такое статический метод?

Статический метод — это метод, который можно вызвать без создания объекта, напрямую через имя класса.

8. Что такое не статический метод?

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

Статичекий метод нельзя переопределять. Он «один» для класса и его наследников.

Статические методы могут ссылаться только на статические переменные. Это гарантирует, что во время выполнения нашего метода все элементы будут инициализированы и будут работать. Это называется «статическим контекстом».

В отличие от локальных переменных статические поля и методы не потокобезопасны в Java.

9. Для чего используется ключевое слово this?

this — это неявный первый параметр любого нестатического метода класса. У какого объекта вызывается метод, тот и будет передан в качестве параметра this .

соответственно, this используется:

  1. в теле любого метода для ссылки на текущий объект, чтобы обращаться к полям и методам данного класса. Например, когда у переменной экземпляра и переменной метода\конструктора одинаковые имена.
  1. когда нужно вызвать один конструктор из другого (например, конструктор по умолчанию вызывается в параметризированном). Вызов this() может находиться только в первой строке конструктора.

10. Какой класс является базовый родительным классов для всех классов?

Object — корневой класс в иерархии классов Java.

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

Ключевое слово super представляет текущий экземпляр родительского класса.

11. Что такое наследование Приведите примеры из реальной жизни?

Это когда один объект перенимает все публичные поля и методы другого объекта.

Автомобили -> Легковые -> Модель1, Модель2.

Млекопитающие -> Киты -> Голубой кит, горбатый кит.

12. Опишите процесс создания нового объекта?

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

Кроме конструктора начальную инициализацию объекта можно проводить с помощью инициализатора объекта (блока инициализации). Инициализатор выполняется до любого конструктора. Т.е. в инициализатор мы можем поместить код, общий для всех конструкторов.

Последовательность инициализации блоков класса и его родителя:

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

13. Как вызвать метод из родительского класса?

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

14. Что такое переопределение метода?

Это возможность задать методу родительского класса другой функционал.

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

15. Можно ли переопределить статический метод?

Нет, статический метод создается при инициализации класса один на все объекты.

16. Что такое виртуальная функция и используются ли они в Java?

Виртуальная функция — это функция (метод), которая может быть переопределена наследником.

В Java практически все функции виртуальные ( private функции не могут быть переопределены в связи с правами видимости)

17. Что такое перегрузка метода?

Перегрузка метода — это наличие в классе нескольких методов с одним именем, но разными наборами параметров.

Перегрузить можно не только метод, но и конструктор.

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

18. Можно ли изменить тип возвращаемых тип данных при перегрузке метода?

Можно, если списки аргументов отличаются, иначе JVM не поймет какой метод ей нужно вызвать.

Т.е. если меняем тип возвращаемого значения, то мы также должны изменить список аргументов перегружаемого метода.

19. Что такое множественное наследование Как его можно реализовать в Java?

Множественное наследование — это наследование класса от нескольких суперклассов одновременно.

В Java запрещено множественное наследование главным образом из-за ромбовидной проблемы.

img

возникает неоднозначность: если метод класса D вызывает метод класса А (и этот метод не переопределён в классе D), а классы B и C по своему переопределили этот метод, то от какого класса его наследовать? от B или C?

В Java множественное наследование поддерживают интерфейсы.

Если есть необходимость использовать методы из двух разных классов, то можно воспользоваться композицией. Для этого в третьем классе нужно создать два необходимых объекта, добавить методы, которые обращаются к нужным методам этих объектов. И наследоваться от этого класса.

20. Что такое полиморфизм Приведите примеры из реальной жизни?

Полиморфизм описывают выражением: Один интерфейс — множество реализаций.

Полиморфизм — это возможность работать с несколькими типами, как будьто это один и тот же тип, в то же время поведение каждого типа будет уникальным в зависимости от его реализации.

Примеры:

  • Пульт управления один для разных моделей.
  • Монетоприемник в каком-нибудь продающем автомате.
  • Цоколь лампочки — это переменная определенного базового типа. Лампочка — созданный объект конкретного класса. Лампочки разные — цоколь один.

21. Что такое инкапсуляция?

Инкапсуляция — это сокрытие реализации и отделение его внутреннего представления от внешнего.

Т.е. это скрытие полей объектов, ограничение доступа к определенным методам и полям.

22. Как реализована инкапсуляция в Java?

специальные методы — геттеров и сеттеров.

модификаторы доступа — специальные слова, которые определяют доступ к данным.

img

Например, модификатором доступа private скрываются поля объекта, и при необходимости к ним разрешается подкотрольный доступ через геттеры и сеттеры.

23. Что такое абстракция?

Абстракция — это выделение значимой информации и исключение из рассмотрения незначимой.

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

Главное достоинство абстракции связано с тем, что она позволяет отделить реализацию объектов от их описания.

Пример: описание узлов в автомобиле. Здесь название узла значимая информация, а описание обязанностей у каждого узала это второстепенная информация. Наример, главной характеристикой для трансмиссии будет то, что этот узел передает крутящий момент от двигателя колесам, а как именно (механика, автомат, робот) это уже второстепенная информация (это вопрос конкретной реализации).

24. Как реализована абстракция в Java?

С помощью абстрактных классов и интерфейсов.

Абстрактные классы позволяют описать общее поведение и задать особенное поведение для классов наследников.

  • поля — содержат состояние объекта;
  • конструктор — инициализирует начальное состояние объекта;
  • абстрактные методы — не содержат реализации, а декларируют, что данный метод будет иметь реализацию в наследуемом классе;
  • методы — позволяют выполнять действия над объектом.

Чтобы создать абстрактный класс нужно использовать ключевое слово abstract перед именем класса.

Нельзя создать объект абстрактного класса.

В таком классе могут быть абстрактные методы, которые обязан реализовать дочерний класс. Абстрактные методы могут быть только в абстрактном классе.

В абстрактном классе можно создавать обычные методы. Они наследуются также, как и для неабстрактных классов.

25. Что такое интерфейс?

Интерфейсы задают описание, как должен работать объект. Интерфейсы не содержат реализации.

  • поля — константы public static final ;
  • абстрактные методы — задают то, как должен работать наш объект, но не определяют как конкретно;
  • статические методы — можем добавлять с Java 8 как обычные static методы.

Это тип данных, который может содержать лишь константы (статические поля), абстрактные методы, а также начиная с Java 8 неабстрактные методы default и static .

Также с Java 8 появилась возможность реализовывать методы с дефолтной реализацией, но опять же без конкретного состояния. Используется для обращения к абстрактному методу и получению из него информации о конкретной реализации.

У интерфейсов нет конструкторов.

Инерфейс позволяет создавать общий тип данных для разных объектов, т.е. использование интерфейса гарантирует наличие определенного метода у объекта.

При реализации интерфейса класс реализовать все его методы, иначе он должен быть помечен как abstract .

Если у интерфейса только один абстрактный метод, перед нами функциональный интерфейс.

Абстрактный класс vs интерфейс

Абстрактный класс содержит состояние объекта, что в интерфейсе невозможно, т.к. поля там являются константами

Наследовать extends можно только один абстрактный класс, а реализовать implements интерфейсов сколько угодно. Интерфейс может наследовать другой интерфейс.

В интерфейсах нет конструкторов.

Абстрактные классы используются, когда есть отношение is-a , т.е. класс наследник расширяет базовый абстрактный класс. Интерфейс же могут быть реализованы разными классами, вовсе не связанными друг с другом.

Поэтому код, написанный на интерфейсах более масштабируем и его легче поддерживать. При использовании абстрактных классов, а это всегда наследование, мы связываем наш код.

26. Что такое внутренний класс Типы внутренних классов?

Вложенный класс — это класс, который находится внутри класса или интерфейса.

img

  • Статические, пример StaticInnerClass:

Нестатические вложенные в другой класс — это внутренние классы.

  • внутренние классы-члены, пример InnerClass:
  • локальные классы, пример LocalClass:
  • анонимные классы, пример:

27. Что такое анонимный класс?

Анонимный класс — это класс, который сразу создается и реализуется (без имени класса) от суперкласса или интерфейса.

28. Для чего используется конструктор в абстрактном классе?

Для инициализации начальных значений общих переменных, объявленных в абстрактном классе и используемых различными реализациями.

29. Можно ли создать анонимный класс, если в классе нет конструктора по умолчанию?

При создании анонимного класса в скобках можно передать аргументы для недефолтового конструктора.

30. Что такое композиция?

Ассоциация — это отношение, при котором объекты одного типа определенным образом связаны с объектами другого типа. Так объект одного типа может содержать или использовать объект другого типа.

Например, когда один класс включает в себя другой класс в качестве одного из полей. Ассоциация описывается словом «имеет». Автомобиль имеет двигатель.

Выделяют два частных случая ассоциации: композицию и агрегацию.

Агрегация — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.

Например, когда экземпляр двигателя создается где-то в другом месте кода, и передается в конструктор автомобиля в качестве параметра.

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

Например, когда двигатель не существует отдельно от автомобиля. Он создается при создании автомобиля и полностью управляется автомобилем. В типичном примере, экземпляр двигателя будет создаваться в конструкторе автомобиля.

31. Что такое агрегация?

32. Какие типы исключительных ситуаций бывают?

img

Throwable — суперкласс исключений. в нем вся логика. Остальные подклассы нужны для того, чтобы определить тип исключений:

Error (unchecked) — неустранимые (как правило) на уровне JVM проблемы. Согласно спецификации Java, не следует пытаться обрабатывать их в собственной программе. https://docs.oracle.com/javase/8/docs/api/java/lang/Error.html

OutOfMemoryError — ошибка переполнения памяти JVM. Программа дополнительную память всё равно не сможет обеспечить для JVM. ThreadDeath — вызывается при неожиданной остановке потока посредством метода Thread.stop() .

StackOverflowError — ошибка переполнение стека. Часто возникает в рекурсивных функциях из-за неправильного условия выхода.

Exception (checked) — являются результатом проблем в программе, которые в принципе решаемые и предсказуемые. Они обязательны для обработки и обычно связаны с бизнес-логикой приложения.

IOException (checked) ошибки созданные неудачными или прерванными операциями ввода-вывода. https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html

SQLException (checked) ошибки доступа к базе данных или другие ошибки, связанных с работой с базами данных. https://docs.oracle.com/javase/8/docs/api/java/sql/SQLException.html

RuntimeException (unchecked) — результат некорректного программирования, компилятор не требует их обработки. https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html

IndexOutOfBoundsException — выбрасывается, когда индекс некоторого элемента в структуре данных (массив/коллекция) не попадает в диапазон имеющихся индексов.

NullPointerException — ссылка на объект, к которому вы обращаетесь хранит null .

ClassCastException – Ошибка приведения типов. Всякий раз при приведении типов делается проверка на возможность приведения (проверка осуществляется с помощью instanceof ).

ArithmeticException — бросается когда выполняются недопустимые арифметические операции, например деление на ноль.

Проверяемые исключения (checked) — это те исключения, которые проверяются при компиляции. Если вы не обработаете их, вы получите ошибку компиляции.

Непроверяемые исключения (unchecked) — это те исключения, которые не проверяются во время компиляции. JVM не будет «ругаться», если вы не обработаете такие исключения.

33. Как обрабатываются исключительные ситуации?

В Java есть пять ключевых слов для работы с исключениями:

try — используется для отметки начала блока кода, который потенциально может привести к ошибке.

catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений. Последовательность блоков catch должна идти от частного к более общему. В противном случае будет ошибка компиляции.

finally — ключевое слово для отметки начала блока кода, которой является дополнительным. Этот блок помещается после последнего блока catch . Управление обычно передаётся в блок finally в любом случае.

throw — служит для генерации исключений.

throws — ключевое слово, которое прописывается в сигнатуре метода, и обозначающее, что метод потенциально может выбросить исключение с указанным типом.

Общий вид конструкции для «поимки» исключительной ситуации выглядит следующим образом:

Для обработки исключений используется конструкция try-catch-finally и c 7й Java try-with-resources .

try-catch-finally :

Пример 2. Начиная с Java 7 можно переотлавливать несколько исключений одни блоком catch.

Для чего служат Конструкторы в c#

srvr4vr's user avatar

Конструкторы уже своим названием намекают на свою суть. Нужны они для инициализации объекта. Через них можно передавать какие-то параметры для инициализации:

В зависимости от выбранного конструктора (передаем параметр или нет, и какой) — меняется поведение объекта. И теперь мы с помощью конструктора гарантируем, что данное поле будет заполнено значением.

Еще он хорошо подходит для инъекций зависимостей. Например так можно реализовать паттерн Стратегия:

В классе стратегии может скрываться сколь угодно сложная логика, и в зависимости от стратегии может быть очень разный результат выполнения — возможности огромные.

Так же в конструкторе происходят инициализации разных полей класса которые того требуют:

И вот вам уже не приходится думать и проверять — создали ли вы список или нет, все будет гарантировано происходить автоматом при создании объекта.

На деле все подходы сочетаются в разных комбинациях. Примерно тем же занимаются порождающие паттерны типа Абстрактных фабрик и Фабричных методов, но там свою нюансы, и фабрики не исключают использования конструкторов, скорее они друг-друга дополняют. Таким образом конструктор заключает в себе некие рутинные мероприятия которые обязаны выполняться всегда при создании объекта. Это позволяет не повторяться, и держать все в одном месте, инкапсулировать внутри класса.

Читать:
Почему не подключается вай фай на компьютере через адаптер

Похожие статьи