Учебники

36) Конструкторы Java

Что такое конструктор в Java?

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

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

  • числовые типы данных установлены в 0
  • типы данных char установлены в нулевой символ (‘\ 0’)
  • ссылочные переменные установлены в нуль

В этом уроке вы узнаете

Правила создания конструктора Java

  1. Имеет то же имя, что и класс
  2. Он не должен возвращать значение, даже не void

Пример 1. Создайте свой первый конструктор Java

Шаг 1) Введите следующий код в вашем редакторе.

class Demo{
      int  value1;
      int  value2;
      Demo(){
         value1 = 10;
         value2 = 20;
         System.out.println("Inside Constructor");
     }
 
     public void display(){
        System.out.println("Value1 === "+value1);
        System.out.println("Value2 === "+value2);
    }
 
   public static void main(String args[]){
       Demo d1 = new Demo();
      d1.display();
  }
}

Шаг 2) Сохраните, запустите и скомпилируйте код. Соблюдайте вывод.

Вывод:

Inside Constructor
Value1 === 10
Value2 === 20

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

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

Примеры допустимых конструкторов для класса Account:

Account(int a);
Account (int a,int b);
Account (String a,int b);

Пример 2 : чтобы понять перегрузку конструктора

Шаг 1) Введите код в редакторе.

class Demo{
      int  value1;
      int  value2;
      /*Demo(){
       value1 = 10;
       value2 = 20;
       System.out.println("Inside 1st Constructor");
     }*/
     Demo(int a){
      value1 = a;
      System.out.println("Inside 2nd Constructor");
    }
    Demo(int a,int b){
    value1 = a;
    value2 = b;
    System.out.println("Inside 3rd Constructor");
   }
   public void display(){
      System.out.println("Value1 === "+value1);
      System.out.println("Value2 === "+value2);
  }
  public static void main(String args[]){
    Demo d1 = new Demo();
    Demo d2 = new Demo(30);
    Demo d3 = new Demo(30,40);
    d1.display();
    d2.display();
    d3.display();
 }
}

Шаг 2) Сохраните, скомпилируйте и запустите код.

Шаг 3) Ошибка =? Попробуйте отладить ошибку, прежде чем переходить к следующему шагу.

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

Но если вы указываете параметризованный конструктор, такой как Demo (int a), и хотите использовать конструктор по умолчанию Demo (), вам обязательно нужно его указать.

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

Шаг 5) Раскомментируйте строку № 4-8. Сохраните, скомпилируйте и запустите код.

Конструктор цепочки

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

Пример 3: для понимания цепочки конструктора

Шаг 1) Скопируйте следующий код в редактор.

class Demo{
   int  value1;
   int  value2;
    Demo(){
      value1 = 1;
      value2 = 2;
      System.out.println("Inside 1st Parent Constructor");
   }
   Demo(int a){
      value1 = a;
      System.out.println("Inside 2nd Parent Constructor");
   }
  public void display(){
     System.out.println("Value1 === "+value1);
     System.out.println("Value2 === "+value2);
  }
  public static void main(String args[]){
     DemoChild d1 = new DemoChild();
     d1.display();
  }
}
class DemoChild extends Demo{
    int value3;
    int value4;
    DemoChild(){
    //super(5);
     value3 = 3;
     value4 = 4;
    System.out.println("Inside the Constructor of Child");
    }
    public void display(){
      System.out.println("Value1 === "+value1);
      System.out.println("Value2 === "+value2);
      System.out.println("Value1 === "+value3);
      System.out.println("Value2 === "+value4);
   }
}

Шаг 2) Запустите код. Благодаря созданию цепочки конструктора при создании объекта дочернего класса DemoChild сначала вызывается конструктор Demo () родительского класса, а затем создается конструктор дочернего класса DemoChild (). Ожидаемый результат =  

Inside 1st Parent Constructor
Inside the Constructor of Child
Value1 === 1
Value2 === 2
Value1 === 3
Value2 === 4

Шаг 3) Вы можете наблюдать, как конструктор родительского класса Demo переопределяется. Что если вы хотите вызвать переопределенный конструктор Demo (int a) вместо конструктора по умолчанию Demo () при создании дочернего объекта?

В таких случаях вы можете использовать ключевое слово «super» для вызова переопределенных конструкторов родительского класса.

Синтаксис:-

super();
--or--
super(parameter list);

Пример: если ваш конструктор похож на Demo (String Name, int a), вы укажете super (“Java”, 5). Если используется, ключевое слово super должно быть первой строкой кода в конструкторе дочернего класса.

Шаг 4) Раскомментируйте строку № 26 и запустите код. Соблюдайте вывод.

Вывод:

Inside 2nd Parent Constructor
Inside the Constructor of Child
Value1 === 5
Value2 === 0
Value1 === 3
Value2 === 4