Как вызвать конструктор из конструктора java
Если в классе есть два конструктора, один из которых принимает параметры, а другой нет, то второй может вызвать первый с помощью ключевого слова this .
Кроме того из конструктора мы можем вызвать конструктор родительского класса с помощью ключевого слова super .
public class App public static void main(String[] args) class ClassX int x; public ClassX() // Конструктор без параметров this(0); // Вызов конструктора с параметрами > public ClassX(int xValue) x = xValue; > > class ClassXY extends ClassX int y; public ClassXY(int xValue, int yValue) super(xValue); // вызов родительского конструктора y = yValue; > > ClassX classX = new ClassX(); System.out.println(classX.x); // => 0 ClassXY classXY = new ClassXY(1, 2); System.out.println(classXY.x + classXY.y); // => 3 > >
Конструкторы. Конструкторы по умолчанию. Вызов конструкторов класса из других конструкторов
Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.
В наиболее общем случае, для класса ClassName , конструктор по умолчанию имеет следующий вид:
class ClassName < . // объявление конструктора ClassName() < // тело конструктора // . > . >
2. В каких случаях конструктор по умолчанию генерируется в классе автоматически а в каких нет? Пример
Если в классе не объявить ни одного конструктора, то, будет генерироваться конструктор по умолчанию. То есть, конструктор по умолчанию генерируется в классе автоматически только в том случае, если класс не содержит реализации других конструкторов. Если класс содержит реализацию хотя бы одного конструктора с параметрами, то, чтобы объявить конструктор по умолчанию, его нужно объявлять в классе явным образом.
Например. В следующем объявлении класса конструктор по умолчанию генерируется автоматически
class CMyClass < int d; int GetD() < return d; > void SetD(int nd) < d = nd; > >
Вышеприведенный код означает, что можно объявлять объект класса с использованием конструктора по умолчанию:
// работает, так как в классе больше не реализовано ни одного конструктора CMyClass mc = new CMyClass();
Если в тело класса CMyClass добавить хотя бы один другой конструктор (например, конструктор с одним параметром), то конструктор по умолчанию автоматически генерироваться не будет
class CMyClass < int d; // объявление конструктора с 1 параметром, // конструктор по умолчанию уже не генерируется автоматически CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >
После вышеприведенной реализации объявить объект с использованием конструктора по умолчанию не удастся. Однако, можно объявить объект с использованием конструктора с одним параметром
// ошибка компиляции, так как в классе уже объявлен другой конструктор // CMyClass mc = new CMyClass(); CMyClass mc2 = new CMyClass(7); // а этот код работает
В результате выполнения вышеприведенной строки будет выдана ошибка компиляции:
The constructor CMyClass() is undefined
Для того, чтобы иметь реализацию конструктора по умолчанию и объявлять объект класса с использованием конструктора по умолчанию, его нужно задавать явно. Это может быть, например, следующим образом
class CMyClass < int d; // явное объявление конструктора по умолчанию CMyClass() < d = 0; > // объявление конструктора с 1 параметром, CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >
После такой реализации можно создавать экземпляр класса с использованием двух конструкторов, например
CMyClass mc = new CMyClass(); // вызывается конструктор по умолчанию mc.d = 25; CMyClass mc2 = new CMyClass(5); // вызывается конструктор с 1 параметром
3. Вызов конструкторов из других конструкторов. Пример
Язык программирования Java позволяет осуществлять вызов конструкторов класса из другого конструктора этого же класса. Для этого используется ключевое слово this , которое есть ссылкой на текущий класс.
Пример. В примере демонстрируется использование класса CPixel , который реализует пиксел на экране монитора.
// Класс, который реализует пиксел на экране монитора public class CPixel < // внутренние переменные класса private int x, y; // координаты пиксела private int color; // цвет пиксела // конструктор без параметров (конструктор по умолчанию) CPixel() < x = y = color = 0; > // конструктор с 2 параметрами, которые инициализируют только координаты CPixel(int _x, int _y) < x = _x; y = _y; color = 0; > // конструктор с 1 параметром, который инициализирует только цвет CPixel(int _color) < color = _color; x = y = 0; > // конструктор с 3 параметрами, который вызывает конструктор с 2 параметрами CPixel (int _x, int _y, int _color) < // вызов конструктора с 2 параметрами: обязательно первая операция и только один раз this(_x, _y); //this(_color); // повторный вызов конструктора запрещен this.color = _color; // так можно > // методы доступа int GetX() < return x; > int GetY() < return y; > int GetColor() < return color; > >
Использование класса CPixel в другом программном коде (методе)
. CPixel cp1 = new CPixel(2,8); // вызов конструктора с 2 параметрами CPixel cp2 = new CPixel(3,5,8); // вызов конструктора, который вызовет другой конструктор int d; d = cp1.GetX(); // d = 2 d = cp2.GetColor(); // d = 8 d = cp2.GetY(); // d = 5 .
4. Какие ограничения (требования) накладываются на вызов других конструкторов из конструктора класса?
Чтобы корректно вызвать другие конструкторы из конструктора класса, нужно придерживаться следующих требований (ограничений):
- вызвать можно только один другой конструктор класса. Вызвать два и больше других конструктора этого класса запрещено. Это вытекает из логики, что конструктор класса предназначен для создания объекта класса только один раз (а не два и больше раза);
- вызов другого конструктора должен быть первой операцией в вызывающем конструкторе. Если в вызывающем конструкторе вызов другого конструктора реализовать второй (третьей и т.д.) операцией, то компилятор выдаст ошибку.
5. Можно ли вызвать конструктор из обычного метода класса?
Нет, нельзя. Конструктор класса может вызваться только из другого конструктора этого же класса. Главное назначение конструктора класса – создание экземпляров (объектов) класса. Этих привилегий лишены методы класса.
Связанные темы
- Конструкторы . Параметризированные конструкторы. Ключевое слово this. «Сборка мусора». Метод finalize() . Примеры
- Перегрузка методов в классах. Перегрузка конструкторов
Вызов конструктора из конструктора
Часто для того, чтобы избежать написание повторяющегося кода инициализации, необходимо вызвать код одного конструктора из другого.

Вот пример, как это можно делать:
Виктор Уровень 20 Expert
18 сентября 2020
Спасибо, помогли решить задачу.
Alexandr Уровень 23
12 сентября 2020
15 мая 2020
Отлично помогли, благодарю! Исправьте ошибку — «избежать (чего?) написаниЯ»
23 апреля 2020
при вызове конструктора java автоматом определяет какой вызывать в зависимости от количества требуемых параметров?
Glock Уровень 13
13 апреля 2020
Спасибо! мне помогло, может и простая вещь это, но затык был.
RedToad Уровень 22
10 марта 2020
По моему, бесполезная статья.
10 февраля 2020
Поделитесь видео по теме
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2023 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2023 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
Вызов одного конструктора из другого в Java
В Java порой возникает необходимость вызвать один конструктор из другого. Это может быть полезно, когда в классе имеется несколько конструкторов, которые выполняют похожие задачи. Вместо дублирования кода в каждом из конструкторов, можно реализовать общую логику в одном конструкторе, а затем вызывать его из остальных.
Рассмотрим простой пример. Представим, что есть класс Car , который имеет два конструктора. Один конструктор принимает два параметра – марку автомобиля и его цвет, а другой – только марку. В обоих случаях нам нужно инициализировать марку, но цвет нужно инициализировать только в первом случае.
public class Car < private String brand; private String color; public Car(String brand, String color) < this.brand = brand; this.color = color; >public Car(String brand) < this.brand = brand; this.color = "Black"; >>
В приведенном выше коде видно, что инициализация марки дублируется в обоих конструкторах. Чтобы избежать дублирования кода, можно вызвать один конструктор из другого с помощью ключевого слова this .
public class Car < private String brand; private String color; public Car(String brand, String color) < this.brand = brand; this.color = color; >public Car(String brand) < this(brand, "Black"); >>
В этом примере конструктор, который принимает только один аргумент, вызывает другой конструктор с помощью this(brand, «Black») . В результате, инициализация марки теперь выполняется только в одном месте.
Необходимо отметить, что вызов другого конструктора должен быть первой операцией в конструкторе. Если попытаться выполнить какой-либо код перед вызовом другого конструктора, компилятор Java выдаст ошибку.
Вот таким образом можно вызвать один конструктор из другого в Java, что помогает избежать дублирования кода и делает программу более чистой и эффективной.
