Конструкторы в Java
Конструкторы — это специальные методы, которые вызывается при создании объекта . Они «конструируют» новый объект определенного класса.
Шаг за шагом
Итак, чтобы объяснить нагляднее, представим, как работает программа.
1. Вы создаете основное «тело» программы, прописывая метод main:
public class Test < public static void main ( String [ ] args ) <
2. Допустим, Вам нужен объект класса Cat. Класс Cat у вас уже есть, и выглядит он так:
private String name ;
private String color ;
public String getName ( ) <
return name ;
public void setName ( String a ) <
public String getColor ( ) <
return color ;
public void setColor ( String color ) <
this . color = color ;
Вы пишете строку, которая должна создать объект класса Cat:
public class Test < public static void main ( String [ ] args ) < Cat cat1 = new Cat ( ) ;
3. В тот момент, когда программа приступает к созданию объекта cat1, она идет в class Cat:
Тут-то и появляется необходимость в конструкторах. Ведь в первую очередь Java ищет именно конструкторы, которые укажут, как именно создавать объект.

Но в нашем классе есть только геттеры и сеттеры — никаких конструкторов! Что же делать? Теперь объект не создастся?
Создастся, конечно. А все потому, что по-настоящему конструктор все равно присутствует — просто он явно не указан. Теперь, давайте посмотрим как создавать конструкторы явно, и какими они вообще бывают.
Явные и неявные конструкторы
Существуют два вида конструкторов — явные и неявные. Вы уже знаете, что, даже если ничего не прописать в коде класса, Вы все равно сможете «сконструировать» объект этого класса. Но, если все и так работает, зачем их вообще писать? Какие преимущества это дает?
Преимущество 1. Контроль над вводом данных.
Сначала, дайте посмотрим на изображение. Какие отличия Вы видите?

Если Вы заметили, что у всех трех классов разное количество параметров в конструкторе — Вы были правы:

Явно прописывая конструктор, Вы получаете возможность регулировать, какие параметры и в каком количестве нужно задать для создания объекта определенного класса.
Код№1 — класс Cat — скорее всего, был создан с использованием неявного конструктора. Он не просит никаких параметров.
Код№2 — класс Scanner — уже использует явно описанный конструктор. Он требует один параметр — и без него создать объект невозможно.
Код№3 — класс Dog — тоже использует явно описанный конструктор. Но тут, как мы видим, требуется уже три параметра — имя («Шарик»), порода («мопс») и возраст собаки (2 года).
Преимущество 2. Меньше строчек кода.
Вы заметили, как конструктор уменьшает количество строк в коде? Сравните:
Конструктор
Конструктор — это специальный метод, который вызывается при создании нового объекта. Не всегда удобно инициализировать все переменные класса при создании его экземпляра. Иногда проще, чтобы какие-то значения были бы созданы по умолчанию при создании объекта. По сути конструктор нужен для автоматической инициализации переменных.
Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения.
private int Cat(); // так выглядит метод по имени Cat Cat(); // так выглядит конструктор класса Cat
В отличие от метода, конструктор никогда ничего не возвращает.
Конструктор определяет действия, выполняемые при создании объекта класса, и является важной частью класса. Как правило, программисты стараются явно указать конструктор. Если явного конструктора нет, то Java автоматически создаст его для использования по умолчанию. Когда мы реализовывали класс Box, то никакого конструктора не создавали.
Добавим в класс конструктор, который просто установит начальные значения для коробки.
class Box < int width; // ширина коробки int height; // высота коробки int depth; // глубина коробки // Конструктор Box() < width = 10; height = 10; depth = 10; >// вычисляем объём коробки int getVolume() < return width * height * depth; >>
Мы временно удалили метод setDim() и добавили конструктор. Посмотрим, что получится:
Box catBox = new Box(); mInfoTextView.setText("Объём коробки: " + catBox.getVolume());
Программа выведет объём коробки, хотя мы не задавали никаких размеров для неё. Благодаря конструктору любая создаваемая коробка будет иметь какой-то зафиксированный объём.
Естественно, вы можете вернуть обратно метод setDim() (см. статью про классы) и установить свои размеры для коробки:
Box catBox = new Box(); // установим свои размеры для коробки catBox.setDim(10, 20, 30); mInfoTextView.setText("Объём коробки: " + catBox.getVolume());
Теперь вам должно быть ясно, что когда после ключевого слова new мы пишем имя класса со скобками, то на самом деле мы вызываем конструктор класса.
Возникает вопрос — но ведь сначала при создании класса мы не создавали конструктор, однако код new Box() работал. Дело в том, что если конструктор не определён явно, то Java создаст конструктор, который будет использоваться по умолчанию. В этом случае он просто присвоит всем переменным нулевые значения. Если вы создали сами конструктор, то конструктор по умолчанию использоваться не будет.
Подобно любому методу, у конструктора могут быть аргументы. В аргументах конструктора передаются параметры для инициализации объекта. Например, если у класса Cat имеется конструктор, который получает в качестве аргумента целое число, обозначающее возраст кота, то объекты Cat будут создаваться следующим образом:
Cat cat = new Cat(8); // коту 8 лет
Если Cat(int) является единственным конструктором класса, то компилятор не позволит создавать объекты Cat каким-либо другим способом.
Однако вернёмся к коробкам для котов. Созданный нами конструктор не особо полезен, так как создаёт одинаковые коробки. Создадим конструктор с параметрами в классе Box и закомментируйте первый конструктор без параметров:
// Второй конструктор Box(int w, int h, int d)
Если класс содержит один конструктор с параметрами, то вам придётся обязательно указать значения при объявлении класса:
// Это конструктор теперь не допустим // Box catBox = new Box(); // В конструкторе нужно указать значения размеров коробки Box catBox = new Box(100, 200, 100); mInfoTextView.setText("Объём коробки: " + catBox.getVolume());
Кстати, с таким конструктором метод setDim() нам уже не нужен. Мы можем задать размеры коробки сразу в конструкторе. Так как скорее всего коробка постоянна и не меняет своих размеров, то метод, пожалуй, лишний. Но если мы будем менять размеры коробки, то метод придётся оставить.
Класс может иметь несколько конструкторов. Снимите комментарий с первого конструктора и создайте две коробки — коробку по умолчанию и большую коробку.
Box defaultBox = new Box(); mInfoTextView.setText("Объём стандартной коробки: " + defaultBox.getVolume()); Box bigBox = new Box(100, 200, 200); mInfoTextView.append("\nОбъём большой коробки: " + bigBox.getVolume());
То есть, мы видим, что конструкторы поддерживают перегрузку, как и методы.
Например, мы можем создать ещё один конструктор специально для коробки в виде куба, где все стороны равны:
// Третий конструктор для куба Box(int len)
Вычисляем размер куба:
Box cube = new Box(5); int vol = cube.getVolume(); mInfoTextView.setText("Объём куба: " + vol);
Используем объект в качестве параметров
Мы пока использовали в качестве параметров в конструкторах простые типы. Но можно передать и объект самого класса. Добавим ещё один конструктор:
// Используем объект типа Box Box(Box ob)
В коде программы можно воспользоваться конструктором следующим образом:
Box box1 = new Box(100, 200, 100); Box cloneBox = new Box(box1); int vol = cloneBox.getVolume(); mInfoTextView.setText("Объём коробки: " + vol);
Класс Box (исходник)
package ru.alexanderklimov.box; class Box < int width; // ширина коробки int height; // высота коробки int depth; // глубина коробки // Конструктор Box() < width = 10; height = 10; depth = 10; >// Второй конструктор Box(int w, int h, int d) < width = w; height = h; depth = d; >// Третий конструктор для куба Box(int len) < width = height = depth = len; >// Используем объект типа Box Box(Box ob) < width = ob.width; height = ob.height; depth = ob.depth; >// вычисляем объём коробки int getVolume() < return width * height * depth; >// устанавливаем размеры коробки void setDim(int w, int h, int d) < width = w; height = h; depth = d; >>
Вызов перегруженных конструкторов через this()
Имея дело с перегруженными конструкторами, удобно один конструктор вызывать из другого через ключевое слово this. При выполнении конструктора this() сначала выполняется перегруженный конструктор, который соответствует списку параметров. Затем выполняются операторы, находящиеся внутри исходного конструктора, если таковые существуют. Вызов конструктора this() должен быть первым оператором в конструкторе.
Для начала создадим класс, который не использует конструктор this(), чтобы понять разницу.
class Cat < int age; int birthday; // Инициализируем переменные явно Cat(int i, int j) < age = i; birthday = j; >// Инициализируем переменные одним и тем значением Cat(int i) < age = i; birthday = i; >// Присвоим значения по умолчанию 0 Cat() < age = 0; birthday = 0; >>
Мы создали класс с тремя конструкторами. Перепишем класс, используя конструктор this().
class Cat < int age; int birthday; // Инициализируем переменные явно Cat(int i, int j) < age = i; birthday = j; >// Инициализируем переменные одним и тем значением Cat(int i) < this(i, i); // вызывается Cat(i, i); >// Присвоим значения по умолчанию 0 Cat() < this(0); // вызывается Cat(0); >>
У нас теперь только один конструктор, который присваивает значения полям — Cat(int, int). Что происходит при выполнении оператора:
Cat cat = new Cat(8);
Вызов конструктора Cat(8) приводит к выполнению конструктора this(8, 8), что равнозначно вызову конструктора Cat(8, 8).
Что происходит при выполнении оператора:
Cat cat2 = new Cat();
В этом случае вызывается конструктор this(0), что приводит к выполнению конструктора Cat(0), поскольку именно эта версия конструктора подходит по списку параметров. При этом конструктор Cat(0) по сути вызывает конструктор Cat(0, 0).
Использование перегруженных конструкторов через конструктор this() позволяет исключить дублирование кода, уменьшая время загрузки классов.
Но следует быть осторожным, так как конструкторы, которые вызывают конструктор this(), выполняются немного медленнее.
Закрытый конструктор
Иногда класс создаётся только для хранения каких-то статических полей и статических методов. Таким классам принято давать имена Utils, но это не обязательно. Такому классу не нужен конструктор, но если автор класса его не создал, то система сама создаст конструктор по умолчанию. Такой конструктор не имеет смысла, а также может послужить источником ошибок. Чтобы предохраниться от подобной проблемы вы сами явно должны создать пустрой конструктор и сделать его закрытым.
public class Utils < private Utils() < throw new AssertionError(); >. //ваш правильный код // Неправильный код, только для демонстрации! public static void someMethod() < Utils utils = new Utils(); utils.toString(); >>
Строка throw new AssertionError() не является обязательной, но она поможет выявить ошибку, если вы вызовете конструктор в самом классе. Компилятор пропустит такой вариант, но программа завершится с ошибкой.
Utils.someMethod(); // программа закроется с ошибкой
Подкласс для данного класса вы создать не сможете.
Как работает конструктор в Java
Узнайте, как работают конструкторы в Java, их роль в создании объектов и основы использования перегруженных конструкторов для гибкости!
Алексей Кодов
Автор статьи
9 июня 2023 в 16:31
Конструкторы в Java играют важную роль в процессе создания объектов. Они используются для инициализации состояния объекта при его создании. В этой статье мы рассмотрим, как работают конструкторы в Java, и разберемся с основными принципами их использования.
Что такое конструктор
Конструктор — это специальный метод в классе, который вызывается при создании нового объекта этого класса. Он обычно имеет тот же имя, что и класс, и не возвращает никакого значения (даже void ). Задача конструктора — инициализировать поля объекта значениями, которые передаются в качестве параметров.
Пример конструктора для класса Person :
class Person < String name; int age; // Конструктор Person(String name, int age) < this.name = name; this.age = age; >>
В этом примере конструктор принимает два параметра: name и age , и инициализирует соответствующие поля объекта их значениями.
Создание объектов с использованием конструкторов
Для создания нового объекта с использованием конструктора нужно использовать ключевое слово new и вызвать конструктор с передачей ему необходимых параметров.
Пример создания объекта класса Person :
Person person = new Person("John", 30);
В этом примере мы создаем новый объект person с именем «John» и возрастом 30 лет, используя конструктор класса Person .
Java-разработчик: новая работа через 11 месяцев
Получится, даже если у вас нет опыта в IT

Перегрузка конструкторов
В Java можно создавать несколько конструкторов с разными параметрами для одного класса. Это называется перегрузкой конструкторов (constructor overloading). Перегруженные конструкторы позволяют инициализировать объекты разными способами, в зависимости от переданных параметров.
Пример перегруженных конструкторов для класса Person :
class Person < String name; int age; // Конструктор с двумя параметрами Person(String name, int age) < this.name = name; this.age = age; >// Конструктор с одним параметром Person(String name) < this.name = name; this.age = 0; // значение по умолчанию >>
Теперь мы можем создавать объекты класса Person с использованием разных конструкторов:
Person person1 = new Person("John", 30); Person person2 = new Person("Alice");
В этом примере person1 будет создан с именем «John» и возрастом 30 лет, а person2 — с именем «Alice» и возрастом 0 (значение по умолчанию).
Заключение
Конструкторы в Java являются важной частью процесса создания объектов и инициализации их состояния. Они позволяют контролировать, какие значения присваиваются полям объекта, и обеспечивают гибкость при создании объектов с использованием разных параметров через перегрузку конструкторов. Надеюсь, эта статья помогла вам разобраться с основами работы конструкторов в Java!
Что такое конструктор в java
Вот вам шутка для затравочки : — Как назвают магическую собаку? — Не слышал, ну и как же ? — Лабракадабрадор
Vladimir Maintser Уровень 11
3 ноября 2023
Просто прекрасная статья, читал на одном дыхании, информация подаётся очень интересно и даже с юмором, 10/10, Jesse Haniel, моё почтение
Юрий Уровень 12
2 октября 2023
Второй раз прочел эту статью, уже через строчку, что тоже было полезно. Текст один в один с этим (у другого автора): https://javarush.com/groups/posts/1949-znakomstvo-s-klassami-napisanie-sobstvennihkh-klassov-konstruktorih Плюсоните за внимательность, друзья.
Капитан IT Уровень 14
23 сентября 2023
Сергей Уровень 36
18 сентября 2023
Отличная статья! Доступно, понятно и с прекрасными примерами)
САН САНЫЧ Уровень 12
3 сентября 2023
V S Уровень 19
18 августа 2023
Статья и картинка со спящими котиками это
Anatoly Уровень 22
14 августа 2023
Автор — гений
Dmitry Vidonov Уровень 29 Expert
9 августа 2023
Хорошо все расписал автор, молодец!
PavelZhabskiy Уровень 17
26 июля 2023
Спасибо автору! У него всегда замечательные статьи)
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2023 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2023 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

