JavaRush /Java блог /Архив info.javarush /Вызов конструктора из конструктора
alexnjc
31 уровень

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

Статья из группы Архив info.javarush
Часто для того, чтобы избежать написание повторяющегося кода инициализации, необходимо вызвать код одного конструктора из другого.
Вызов конструктора из конструктора - 1
Вот пример, как это можно делать:

public class SomeClass {
  int a;
  int b;
  int c;
  
public SomeClass(int a, int b){
   this.a = a;
   this.b = b;
  }

public SomeClass(int a, int b, int c){
    // Вызов конструктора с двумя параметрами.
    this(a, b);
    this.c = c; 
  }

public void show(){
    System.out.println("a = " + a);
    System.out.println("b = " + b);
    System.out.println("c = " + c);
  }
}
Как вы видите, для этого используется ключевое слово this, после которого в круглых скобках указываем параметры для соотвествующего конструктора (с двумя параметрами в данном случае). Вы можете вызвать один конструктор из другого в том же классе, или в надклассе, со следующими ограничениями:
  • Вызываемый конструктор должен быть в первой строке кода в вызывающем конструкторе.
  • Вложенный конструктор не может иметь никакой явной или неявной ссылки на "this". Таким образом, вы не можете попасть во внутренний класс.
Комментарии (40)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
milyasow Уровень 34
13 февраля 2022
Вижу, многие ломают себе мозг, пытаясь понять, что же значит загадочная фраза Вложенный конструктор не может иметь никакой явной или неявной ссылки на "this". Таким образом, вы не можете попасть во внутренний класс. А это на самом деле просто кастрированный перевод одного из ответов на SO: It cannot have any explicit or implicit reference to this. So you cannot pass an inner class (even an anonymous one if it references any instance methods), or the result of a non-static method call, as a parameter. И правильно переводится как: Это [ вызов одного конструктора из другого с помощью this() или super() ] не может иметь никакой явной или неявной ссылки на "this". Поэтому вы не можете передать вложенный класс (...), или результат вызова нестатического метода в качестве параметра Почему? Потому что вы находитесь в конструкторе, а это значит, что ни объект, на который вы ссылаетесь через ключевое слово "this", ни объект внешнего класса еще не СОЗДАНЫ! Вот поэтому нельзя вызвать нестатический метод экземпляра этого класса. Вы просто не можете сделать что-либо с тем, что еще не существует! По той же причине также нельзя передать внутренний класс в качестве параметра конструктора, ведь согласно отличной статье про вложенные классы: Внутренний класс не может содержать статические переменные и методы., ведь без объекта «внешнего» класса доступа к внутреннему классу у нас не будет. А если рассматривать ситуацию с базовым классом и классом-потомком, то при вызове из потомка конструктора базового класса с помощью super(), нужно помнить, что сначала работает конструктор базового класса, а лишь потом инициализируются переменные класса-потомка. То есть вы, по сути, попытаетесь передать в конструктор класс, поля которого еще не инициализированы, конечно же это приведет к ошибке.
Dima_Sever Уровень 18
21 апреля 2021
Казалось бы мелочь, а очень важная мелочь. Большое Вам спасибо за статью!
Wiun Уровень 16
17 марта 2021
а так можно вызвать?

this.SomeClass(a, b);
this.c=c;
?
🦔 Виктор Уровень 20 Expert
18 сентября 2020
Спасибо, помогли решить задачу.
Alexandr Уровень 23
12 сентября 2020
Полезно
Andrew Petrushenkov Уровень 9
15 мая 2020
Отлично помогли, благодарю! Исправьте ошибку - "избежать (чего?) написаниЯ"
Григорий Уровень 9
23 апреля 2020
при вызове конструктора java автоматом определяет какой вызывать в зависимости от количества требуемых параметров?
Glock Уровень 13
13 апреля 2020
Спасибо! мне помогло, может и простая вещь это, но затык был.
RedToad Уровень 22
10 марта 2020
По моему, бесполезная статья.
Daniil Vishnivetsky Уровень 9
10 февраля 2020
Поделитесь видео по теме