В этой истории мы узнаем о конструкторах 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 правильный.