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

Конструктор Java: объектов, классов

Java-конструктор – это специальный метод, который вызывается при создании экземпляра объекта. Другими словами, когда вы используете новое ключевое слово. Цель конструктора – инициализировать вновь созданный объект перед его использованием.

Вот простой пример:

Здесь создается новый объект MyClass и вызывается конструктор без аргументов MyClass.

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

Объявление конструктора Java

Простой пример объявления конструктора:

Конструктор – это часть:

Перегрузка конструктора

Класс может иметь несколько конструкторов, если их сигнатура (параметры, которые они принимают) не совпадают. Когда класс содержит несколько конструкторов, мы говорим, что конструктор перегружен (поставляется в нескольких версиях):

Класс выше содержит два конструктора. Первый – без аргументов, то есть он не принимает параметров. Второй – принимает параметр int. Внутри тела значение параметра int присваивается полю, то есть значение параметра копируется в поле. Таким образом, поле инициализируется для данного значения параметра.

Ключевое слово this перед именем поля (this.number) необязательно. Оно просто сообщает компилятору, что это поле с именем number, на которое ссылаются.

Конструктор по умолчанию, без аргументов

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

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

Параметры

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

В этом примере объявлены 3 параметра: первый, последний и год. Внутри тела значения этих трех параметров присваиваются полям объекта Employee.

Разрывы строки на Java после каждого параметра являются необязательными. Компилятор здесь игнорирует разрывы строк. Вы также можете написать объявление параметра в одну строку, если хотите, например:

Чтобы вызвать этот конструктор, который принимает три параметра, вы должны создать экземпляр объекта Employee следующим образом:

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

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

Внутри конструктора класса Employee идентификаторы firstName, lastName и birthYear теперь ссылаются на параметры конструктора, а не на поля Employee с одинаковыми именами. Таким образом, конструктор теперь просто устанавливает параметры, равные им самим. Поля Сотрудника никогда не инициализируются.

Чтобы сообщить компилятору, что вы имеете в виду поля класса Employee, а не параметры, поместите ключевое слово this и точку перед именем поля:

Теперь поля Employee правильно инициализируются внутри конструктора.

Вызов

Вы вызываете конструктор, когда создаете новый экземпляр класса, содержащий его:

Этот пример вызывает конструктор без аргументов для MyClass, как определено ранее в этом тексте.

Если вы хотите передать параметры конструктору, вы должны включить их в круглые скобки после имени класса:

Этот пример передает один параметр конструктору MyClass, который принимает int в качестве параметра.

Вызов конструктора из конструктора

В Java можно вызвать конструктор из другого конструктора. Для этого используется ключевое слово this:

Обратите внимание на второе определение конструктора. Внутри тела конструктора вы найдете этот оператор Java:

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

Вызов в суперклассах

В класс может расширять другой. В этом случае говорят, что он «наследует» от класса, который он расширяет. Расширяемый класс называется подклассом, а расширяемый – суперклассом.

Класс, который расширяет другой, не наследует его конструкторы. Однако подкласс должен вызывать конструктор в суперклассе внутри одного из конструкторов подкласса!

Класс Car расширяет (наследует) класс Vehicle:

Обратите внимание на конструктор в классе Car. Он вызывает конструктор в суперклассе, используя этот оператор:

Использование ключевого слова super относится к суперклассу класса. Когда за ключевым словом следуют круглые скобки, как здесь, это относится к конструктору в суперклассе. В этом случае это относится к конструктору в классе Vehicle. Поскольку Car расширяет Vehicle, все конструкторы Car должен вызывать конструктор в Vehicle.

Модификаторы доступа

Модификатор доступа конструктора определяет, какие классы в вашем приложении могут вызывать его. Например, если конструктор объявлен защищенным, то он может вызывать только классы в одном пакете или подклассы этого класса.

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

Исключение

Можно сгенерировать исключение из конструктора:

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

Вот пример вызова конструктора Car:

Если из конструктора Car выдается исключение, переменной car никогда не будет назначена ссылка на объект Car, который вы пытаетесь создать. Переменная car по-прежнему будет указывать на ноль.

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

Источник

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

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в javaДля чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в javaДля чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в javaДля чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в javaДля чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в javaДля чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Шаг за шагом

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

1. Вы создаете основное «тело» программы, прописывая метод main:

2. Допустим, Вам нужен объект класса Cat. Класс Cat у вас уже есть, и выглядит он так:

Вы пишете строку, которая должна создать объект класса Cat:

3. В тот момент, когда программа приступает к созданию объекта cat1, она идет в class Cat:

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Тут-то и появляется необходимость в конструкторах. Ведь в первую очередь Java ищет именно конструкторы, которые укажут, как именно создавать объект.

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Явные и неявные конструкторы

Преимущество 1. Контроль над вводом данных.

Сначала, дайте посмотрим на изображение. Какие отличия Вы видите?

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

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

Преимущество 2. Меньше строчек кода.

Вы заметили, как конструктор уменьшает количество строк в коде? Сравните:

Источник

Объекты и Конструкторы

1. Создание объекта

Вот мы и дошли до созданий объектов. Вы уже сталкивались с этим ранее, просто сейчас мы разберем эту тему более подробно. На самом деле создавать объекты очень просто.

Чтобы создать объект, нужно использовать оператор new. Выглядит создание объекта примерно так:

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

КодПримечание
Создание объекта типа Object
Создание объекта типа Cat
Создание объекта типа Scanner

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

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

Слева от знака равенства — создание переменной. Справа — создание объекта. Все.

2. Конструктор

Вы, наверное, часто видели, что при создании объекта в него передаются какие-то параметры. Причем в некоторые объекты параметры передаются, а в некоторые — нет. Как вообще работает весь этот механизм с параметрами?

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

Отличить метод-конструктор от обычного метода в коде несложно. Такой метод обладает двумя особенностями:

Общий вид его обычно такой:

Обратите внимание, как выглядит метод-конструктор: у него нет типа-результата и его имя совпадает с именем-класса.

И еще один момент: посмотрите на код внутри конструктора. Переменные-параметры конструктора имеют те же имена, что и поля класса – x, y. Это стандартная практика, чтобы не выдумывать названия переменных. Берутся те же имена, что у полей класса, а конфликт имен решается с помощью ключевого слова this.

3. Вызов конструктора

Когда вы создаете новый объект с помощью оператора new и команды вида «new Класс ( параметры )», происходят две вещи:

Вы как программист сами решаете, какие у вашего класса должны быть конструкторы, и какие у этих конструкторов должны быть параметры.

Допустим, вы решили создать класс для учета котов в приюте для животных. Тогда ваш класс Cat может иметь такой вид:

КодПримечание
Класс Point

Конструктор класса Point

Так можно
А так — нельзя. Код не скомпилируется.
И так нельзя. Код не скомпилируется.

У класса Cat всего один конструктор с параметрами name и age. Т.к. других конструкторов нет, вы обязаны при создании объекта передать в качестве параметров имя ( name ) и возраст ( age ) кота. Вы не можете не передать параметры в конструктор.

4. Несколько конструкторов

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

КодПримечание
Так можно: вызовется первый конструктор
Так можно: вызовется второй конструктор
А так — нельзя. Код не скомпилируется.

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

Если переменной age не присвоить никакого значения, она будет хранить значение по умолчанию == 0. А ведь найденному на улице котенку вполне себе может быть 0 полных лет. Поэтому ноль в переменой age совсем не обязательно обозначает «неизвестный возраст».

5. Конструктор по умолчанию

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

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

КодПримечание
Так можно: вызовется первый конструктор
Так можно: вызовется второй конструктор

Конструктор по умолчанию

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

Если у вашего класса вообще нет ни одного конструктора, компилятор добавит вам в класс конструктор-по-умолчанию – конструктор без параметров и кода, но с модификатором public.

Однако, если в вашем классе есть хотя бы один конструктор, конструктор-по-умолчанию уже добавляться не будет – вам нужно будет дописать его самостоятельно.

Источник

Создание объектов и конструкторы

Разбираем основные моменты, связанные с написанием собственных конструкторов классов в Java.

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Процесс создания объектов — один из важных аспектов программирования на Java. Под созданием подразумевают как минимум две основные операции: создание нового объекта класса и инициализацию полей объекта.

В этой статье мы рассмотрим:

Для чего нужны конструкторы в java. Смотреть фото Для чего нужны конструкторы в java. Смотреть картинку Для чего нужны конструкторы в java. Картинка про Для чего нужны конструкторы в java. Фото Для чего нужны конструкторы в java

Программист, преподаватель Skillbox. Пишет про Java.

Что такое конструкторы классов

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

Самый простой способ создать объект — это строка вида:

Рассмотрим порядок создания объекта. В этой строке выполняется три действия:

Приведённый выше код можно разбить на две строки:

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

В первой строке кода переменная murka объявляется как ссылка на объект типа Cat. Здесь важно понять, что объектная переменная фактически не содержит никакого объекта. Значение любой объектной переменной в Java представляет собой ссылку на объект, размещённый в памяти. В данный момент переменная murka пока ещё не ссылается на объект (содержит пустое значение null).

Во второй строке кода создаётся новый объект типа Cat, а ссылка на него присваивается переменной murka. С этого момента переменная murka оказывается ассоциированной с объектом. Чтобы работать с объектами, нужно сначала создать их и задать их исходное состояние. Затем к этим объектам можно применять методы.

Теперь взглянем на код класса Cat (без методов):

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

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

Для справки: Для числовых типов данных значением по умолчанию является нулевое, для типа boolean — логическое значение false, а для ссылочных типов — пустое значение null.

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

Сразу отметим, что полагаться на действия по умолчанию не следует. Если поля инициализируются неявно, программа становится менее понятной.

Как работают параметризованные конструкторы

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

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

Например, конструкторы ниже являются разными и вполне могут существовать в одном классе и иметь разную логику:

Заметьте, что конструкторы ниже для компилятора одинаковы и вызовут ошибку при запуске программы (тип, количество и порядок следования параметров идентичны):

Разберём пример применения параметризованного конструктора класса Cat с добавленным полем имени:

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

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

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

Важно: вызов другого конструктора всегда должен стоять первой строкой в конструкторе.

Вот пример оптимизации кода первого из конструкторов:

Обратите внимание: Несколько слов насчёт ключевого слова this. Синтаксис языка Java не запрещает использовать имена параметров или локальных переменных, совпадающие с именами переменных экземпляра (класса). В таком случае говорят, что локальная переменная или параметр скрывает переменную экземпляра. При этом доступ к скрытой переменной экземпляра обеспечивается с помощью ключевого слова this.

Приведённый ниже пример конструктора класса Cat показывает, каким образом лучше выполнять присваивание переданных в конструктор параметров переменным класса:

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

Но в целом читаемость кода — это отдельная и довольно обширная тема.

Инициализация полей объекта

Основная задача конструкторов — подготовка объекта к работе с ним и установка значений для полей (переменных) объекта. Но есть и другие варианты установки значения для полей. Это явная инициализация и так называемые блоки инициализации.

Явная инициализация — это возможность присвоить полю соответствующее значение указанным ниже образом:

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

Блоки инициализации выглядят так:

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

В таком случае блок инициализации будет выполнен при первом обращении к этому классу. Попробуйте выполнить вот такой код:

Что в итоге

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

1. Если в первой строке кода одного конструктора вызывается второй конструктор, то второй конструктор выполняется с предоставляемыми аргументами.

3. Выполняется тело конструктора.

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

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

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

Для изучения — пример, который содержит все элементы, описанные в статье. А именно:

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

Источник

Конструктор

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

В отличие от метода, конструктор никогда ничего не возвращает.

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

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

Мы временно удалили метод setDim() и добавили конструктор. Посмотрим, что получится:

Программа выведет объём коробки, хотя мы не задавали никаких размеров для неё. Благодаря конструктору любая создаваемая коробка будет иметь какой-то зафиксированный объём.

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

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

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

Если Cat(int) является единственным конструктором класса, то компилятор не позволит создавать объекты Cat каким-либо другим способом.

Однако вернёмся к коробкам для котов. Созданный нами конструктор не особо полезен, так как создаёт одинаковые коробки. Создадим конструктор с параметрами в классе Box и закомментируйте первый конструктор без параметров:

Если класс содержит один конструктор с параметрами, то вам придётся обязательно указать значения при объявлении класса:

Кстати, с таким конструктором метод setDim() нам уже не нужен. Мы можем задать размеры коробки сразу в конструкторе. Так как скорее всего коробка постоянна и не меняет своих размеров, то метод, пожалуй, лишний. Но если мы будем менять размеры коробки, то метод придётся оставить.

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

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

Вычисляем размер куба:

Используем объект в качестве параметров

Мы пока использовали в качестве параметров в конструкторах простые типы. Но можно передать и объект самого класса. Добавим ещё один конструктор:

В коде программы можно воспользоваться конструктором следующим образом:

Класс Box (исходник)

Вызов перегруженных конструкторов через this()

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

Для начала создадим класс, который не использует конструктор this(), чтобы понять разницу.

Мы создали класс с тремя конструкторами. Перепишем класс, используя конструктор this().

Вызов конструктора Cat(8) приводит к выполнению конструктора this(8, 8), что равнозначно вызову конструктора Cat(8, 8).

Что происходит при выполнении оператора:

В этом случае вызывается конструктор this(0), что приводит к выполнению конструктора Cat(0), поскольку именно эта версия конструктора подходит по списку параметров. При этом конструктор Cat(0) по сути вызывает конструктор Cat(0, 0).

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

Но следует быть осторожным, так как конструкторы, которые вызывают конструктор this(), выполняются немного медленнее.

Закрытый конструктор

Иногда класс создаётся только для хранения каких-то статических полей и статических методов. Таким классам принято давать имена Utils, но это не обязательно. Такому классу не нужен конструктор, но если автор класса его не создал, то система сама создаст конструктор по умолчанию. Такой конструктор не имеет смысла, а также может послужить источником ошибок. Чтобы предохраниться от подобной проблемы вы сами явно должны создать пустрой конструктор и сделать его закрытым.

Строка throw new AssertionError() не является обязательной, но она поможет выявить ошибку, если вы вызовете конструктор в самом классе. Компилятор пропустит такой вариант, но программа завершится с ошибкой.

Подкласс для данного класса вы создать не сможете.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *