В этой истории мы узнаем о конструкторах Java, их типах и способах их использования с помощью примеров.

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

Конструктор в Java подобен методу, который вызывается при создании объекта класса.
В отличие от методов Java, конструктор имеет то же имя, что и класс, и не имеет возвращаемого типа. Например:

class Test {
  Test() {
    // constructor body
  }
}

Здесь Test() — это конструктор. Он имеет то же имя, что и класс, и не имеет возвращаемого типа.

Пример 1. Конструктор Java

class Main {
  private String name;

  // constructor
  Main() {
    System.out.println("Constructor Called:");
    name = "Programiz";
  }

  public static void main(String[] args) {

    // constructor is invoked while
    // creating an object of the Main class
    Main obj = new Main();
    System.out.println("The name is " + obj.name);
  }
}

Вывод

Constructor Called:
The name is Programiz

В приведенном выше примере мы создали конструктор с именем Main(). Внутри конструктора мы инициализируем значение переменной имени.

Обратите внимание на заявление о создании объекта класса Main().

Main obj = new Main();

Здесь при создании объекта вызывается конструктор Main(). И инициализируется значение переменной имени.

Следовательно, программа печатает значение переменных имени как Programiz.

Типы конструктора
В Java конструкторы можно разделить на 3 типа:
1. Конструктор без аргументов
2. Параметризованный конструктор
3. Конструктор по умолчанию Конструктор

Конструкторы Java без аргументов
Подобно методам, конструктор Java может иметь или не иметь каких-либо параметров (аргументов).
Если конструктор не принимает никаких параметров, это известно как конструктор без аргументов. Например:

class Main {

  int i;

  // constructor with no parameter
  private Main() {
    i = 5;
    System.out.println("Constructor is called");
  }

  public static void main(String[] args) {

    // calling the constructor without any parameter
    Main obj = new Main();
    System.out.println("Value of i: " + obj.i);
  }
}

Вывод

Constructor is called
Value of i: 5

В приведенном выше примере мы создали конструктор Main(). Здесь конструктор не принимает никаких параметров. Следовательно, он известен как конструктор без аргументов.

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

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

class Company {
  String name;

  // public constructor
  public Company() {
    name = "Programiz";
  }
}

class Main {
  public static void main(String[] args) {

    // object is created in another class
    Company obj = new Company();
    System.out.println("Company name = " + obj.name);
  }
}

Вывод

Company name = Programiz

Параметризованный конструктор Java
Конструктор Java также может принимать один или несколько параметров. Такие конструкторы известны как параметризованные конструкторы (конструктор с параметрами).

class Main {

  String languages;

  // constructor accepting single value
  Main(String lang) {
    languages = lang;
    System.out.println(languages + " Programming Language");
  }

  public static void main(String[] args) {

    // call constructor by passing a single value
    Main obj1 = new Main("Java");
    Main obj2 = new Main("Python");
    Main obj3 = new Main("C");
  }
}

Вывод

Java Programming Language
Python Programming Language
C Programming Language

В приведенном выше примере мы создали конструктор с именем Main(). Здесь конструктор принимает один параметр. Обратите внимание на выражение:

Main obj1 = new Main("Java");

Здесь мы передаем единственное значение конструктору. На основе переданного аргумента языковая переменная инициализируется внутри конструктора.

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

class Main {

  int a;
  boolean b;

  public static void main(String[] args) {

    // A default constructor is called
    Main obj = new Main();

    System.out.println("Default Value:");
    System.out.println("a = " + obj.a);
    System.out.println("b = " + obj.b);
  }
}

Вывод

Default Value:
a = 0
b = false

Здесь мы не создали никаких конструкторов. Следовательно, компилятор Java автоматически создает конструктор по умолчанию.

В приведенной выше программе переменные a и b инициализируются значениями по умолчанию 0 и false соответственно.

Вышеупомянутая программа эквивалентна:

class Main {

  int a;
  boolean b;

   Main() {
    a = 0;
    b = false;
  }

  public static void main(String[] args) {
    // call the constructor
    Main obj = new Main();

    System.out.println("Default Value:");
    System.out.println("a = " + obj.a);
    System.out.println("b = " + obj.b);
  }
}

Вывод

Default Value:
a = 0
b = false

Важные примечания о конструкторах Java

  • Конструкторы вызываются неявно, когда вы создаете объекты.
  • Два правила создания конструктора:
    Имя конструктора должно совпадать с именем класса.
    Конструктор Java не должен иметь тип возвращаемого значения.
  • Если у класса нет конструктора, компилятор Java автоматически создает конструктор по умолчанию во время выполнения. Конструктор по умолчанию инициализирует переменные экземпляра значениями по умолчанию. Например, переменная int будет инициализирована как 0.
  • Типы конструкторов:
    Конструктор без аргументов — конструктор, который не принимает никаких аргументов
    Параметризованный конструктор — конструктор, который принимает аргументы
    Конструктор по умолчанию — конструктор, который автоматически создается компилятором Java, если он не определен явно.
  • Конструктор не может быть abstract, static или final.
  • Конструктор можно перегрузить, но нельзя переопределить.

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

Подобно перегрузке методов Java, мы также можем создать два или более конструктора с разными параметрами. Это называется перегрузкой конструкторов.

class Main {

  String language;

  // constructor with no parameter
  Main() {
    this.language = "Java";
  }

  // constructor with a single parameter
  Main(String language) {
    this.language = language;
  }

  public void getName() {
    System.out.println("Programming Langauage: " + this.language);
  }

  public static void main(String[] args) {

    // call constructor with no parameter
    Main obj1 = new Main();

    // call constructor with a single parameter
    Main obj2 = new Main("Python");

    obj1.getName();
    obj2.getName();
  }
}

Вывод

Programming Language: Java
Programming Language: Python

В приведенном выше примере у нас есть два конструктора: Main() и Main(String language). Здесь оба конструктора инициализируют значение языковой переменной разными значениями.

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

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

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

class Main {

  int sum;

  // first constructor
  Main() {
    // calling the second constructor
    this(5, 2);
  }

  // second constructor
  Main(int arg1, int arg2) {
    // add two value
    this.sum = arg1 + arg2;
  }

  void display() {
    System.out.println("Sum is: " + sum);
  }

  // main class
  public static void main(String[] args) {

    // call the first constructor
    Main obj = new Main();

    // call display method
    obj.display();
  }
}

Вывод

Sum is: 7

В приведенном выше примере мы создали класс с именем Main. Здесь вы создали два конструктора внутри класса Main.

Main() {..}

Main(int arg1, int arg2) {...}

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

Примечание. Строка внутри конструктора, которая вызывает другой конструктор, должна быть первой строкой конструктора. То есть this(5, 2) должна быть первой строкой Main().

Вызов конструктора суперкласса из конструктора дочернего класса

Мы также можем вызвать конструктор суперкласса из конструктора дочернего класса, используя super().

// superclass
class Languages {

  // constructor of the superclass
  Languages(int version1, int version2) {

    if (version1 > version2) {
      System.out.println("The latest version is: " + version1);
    }

    else {
      System.out.println("The latest version is: " + version2);
    }

  }
}

// child class
class Main extends Languages {

  // constructor of the child class
  Main() {
    // calling the constructor of super class
    super(11, 8);
  }

  // main method
  public static void main(String[] args) {

    // call the first constructor
    Main obj = new Main();

  }
}

Вывод

The latest version is: 11

В приведенном выше примере мы создали суперкласс с именем Languages ​​и подкласс Main. Внутри конструктора класса Main обратите внимание на строку:

super(11, 8);

Здесь мы вызываем конструктор суперкласса (то есть Languages(int version1, int version2)) из конструктора подкласса (Main()).

Давайте сделаем один тест, связанный с конструктором:

Каковы результаты следующего?

package beach;
public class Sand {
public Sand() {
System.out.print("a");
}
public void Sand() {
System.out.print("b");
}
public void run() {
new Sand();
Sand();
}
public static void main(String... args) {
new Sand().run();
}
}

А. а
Б. аб
С. aab
D. Ничего из вышеперечисленного

C. Метод main() вызывает конструктор, который выводит a. Затем основной метод вызывает метод run(). Метод run() снова вызывает конструктор, который снова выводит a. Затем метод run() вызывает метод Sand(), имя которого совпадает с именем конструктора. Это выводит b. Следовательно, Вариант C правильный.