Блок инициализатора против статического блока против конструктора в Java

Здравствуйте, Java-разработчики.

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

Начнем обсуждение с:

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

Обратите внимание на следующий фрагмент кода:

Когда мы запускаем его, он выводит:

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

Далее следует Статический блок. В фрагменте кода, показанном выше, давайте сделаем переменную i статической. Обновленный фрагмент кода будет выглядеть так:

И обновленный вывод:

Он отличается от нашего предыдущего результата! даже ничего не меняя в методе main. Зачем? потому что, сделав i статическим, он станет переменной уровня класса, и теперь он будет использоваться совместно объектами. Так как оба объекта first и second теперь ссылаются на один и тот же i, изменения, внесенные в один объект, отразятся на других объектах. Таким образом, для статических переменных инициация объекта с помощью конструктора может привести к неправильному или непредсказуемому поведению кода.

Следовательно, для инициализации статической переменной более подходящим способом будет использование статического блока . Фрагмент кода со статическим блоком будет выглядеть так:

Да, никаких конструкторов! потому что inow будет инициализирован во время загрузки класса, и к нему можно будет получить доступ в любом месте, просто по имени класса, как показано во фрагменте кода. Этот статический блок будет выполняться только один раз для класса во время загрузки класса. Поэтому для всего, что мы хотим инициализировать только один раз для каждого класса и которое может использоваться совместно с объектами, мы можем использовать статический блок.

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

Для лучшего понимания рассмотрим следующий фрагмент кода:

Ниже приведен вывод, когда мы выполняем приведенный выше код:

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

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

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

Подпишитесь на меня, чтобы получать обновления о моих сообщениях и видеть все мои сообщения здесь.

Спасибо,

Абхишек Дубей