Рубрики
Без рубрики

Конструктор на Java

Конструктор в Java, конструктор классов java, конструктор по умолчанию java, перегрузка конструктора в java, цепочка конструкторов в java, частный конструктор в java, типы конструктора в java, параметризованный конструктор в java, конструктор копирования java, пример конструктора java, супер конструктор java.

Автор оригинала: Pankaj Kumar.

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

Конструктор на Java

Всякий раз, когда мы используем ключевое слово new для создания экземпляра класса, вызывается конструктор и возвращается объект класса. Поскольку конструктор может возвращать объект только в класс, это неявно выполняется средой выполнения java, и мы не должны добавлять к нему возвращаемый тип.

Если мы добавим возвращаемый тип в конструктор, то он станет методом класса. Это способ, которым среда выполнения java различает обычный метод и конструктор. Давайте предположим, что у нас есть следующий код в Employee классе.

public Employee() {
	System.out.println("Employee Constructor");
}


public Employee Employee() {
	System.out.println("Employee Method");
	return new Employee();
}

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

Типы конструкторов в Java

В java существует три типа конструкторов.

  1. Конструктор по умолчанию
  2. Конструктор без аргументов
  3. Параметризованный конструктор

Давайте рассмотрим все эти типы конструкторов на примерах программ.

Конструктор по умолчанию в Java

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

package com.journaldev.constructor;

public class Data {

	public static void main(String[] args) {
		Data d = new Data();
	}
}
  1. Роль конструктора по умолчанию заключается только в инициализации объекта и возврате его в вызывающий код.
  2. Конструктор по умолчанию всегда без аргумента и предоставляется компилятором java только в том случае, если не определен существующий конструктор.
  3. Большую часть времени нас устраивает сам конструктор по умолчанию, так как другие свойства могут быть доступны и инициализированы с помощью методов getter setter.

Конструктор без аргументов

Конструктор без каких-либо аргументов называется конструктором без аргументов. Это похоже на переопределение конструктора по умолчанию и используется для выполнения некоторых операций предварительной инициализации, таких как проверка ресурсов, сетевых подключений, ведение журнала и т. Д. Давайте быстро взглянем на конструктор без аргументов в java.

package com.journaldev.constructor;

public class Data {
        //no-args constructor
	public Data() {
		System.out.println("No-Args Constructor");
	}
	public static void main(String[] args) {
		Data d = new Data();
	}
}

Теперь , когда мы вызовем новые данные () , будет вызван наш конструктор без аргументов. Приведенное ниже изображение иллюстрирует это поведение, проверьте вывод программы на консоль.

Параметризованный конструктор

Конструктор с аргументами называется параметризованным конструктором. Давайте рассмотрим пример параметризованного конструктора в java.

package com.journaldev.constructor;

public class Data {

	private String name;

	public Data(String n) {
		System.out.println("Parameterized Constructor");
		this.name = n;
	}

	public String getName() {
		return name;
	}

	public static void main(String[] args) {
		Data d = new Data("Java");
		System.out.println(d.getName());
	}

}

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

Когда у нас есть более одного конструктора, это перегрузка конструктора в java. Давайте рассмотрим пример перегрузки конструктора в java-программе.

package com.journaldev.constructor;

public class Data {

	private String name;
	private int id;

	//no-args constructor
	public Data() {
		this.name = "Default Name";
	}
	//one parameter constructor
	public Data(String n) {
		this.name = n;
	}
	//two parameter constructor
	public Data(String n, int i) {
		this.name = n;
		this.id = i;
	}

	public String getName() {
		return name;
	}

	public int getId() {
		return id;
	}

	@Override
	public String toString() {
		return "ID="+id+", Name="+name;
	}
	public static void main(String[] args) {
		Data d = new Data();
		System.out.println(d);
		
		d = new Data("Java");
		System.out.println(d);
		
		d = new Data("Pankaj", 25);
		System.out.println(d);
		
	}

}

Частный конструктор в Java

Обратите внимание , что мы не можем использовать абстрактные , окончательные, статические и синхронизированные ключевые слова с конструкторами. Однако мы можем использовать модификаторы доступа для управления созданием экземпляра объекта класса. Использование общедоступного и по умолчанию доступа по-прежнему нормально, но какой смысл делать конструктор закрытым? В этом случае любой другой класс не сможет создать экземпляр класса.

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

// private constructor
private Data() {
	//empty constructor for singleton pattern implementation
	//can have code to be used inside the getInstance() method of class
}

Цепочка конструкторов в Java

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

Обратите внимание, что другой вызов конструктора должен быть первым оператором в блоке кода. Кроме того, не должно быть рекурсивных вызовов, которые создадут бесконечный цикл. Давайте рассмотрим пример цепочки конструкторов в java-программе.

package com.journaldev.constructor;

public class Employee {

	private int id;
	private String name;
	
	public Employee() {
		this("John Doe", 999);
		System.out.println("Default Employee Created");
	}
	
	public Employee(int i) {
		this("John Doe", i);
		System.out.println("Employee Created with Default Name");
	}
	public Employee(String s, int i) {
		this.id = i;
		this.name = s;
		System.out.println("Employee Created");
	}
	public static void main(String[] args) {

		Employee emp = new Employee();
		System.out.println(emp);
		Employee emp1 = new Employee(10);
		System.out.println(emp1);
		Employee emp2 = new Employee("Pankaj", 20);
		System.out.println(emp2);
	}

	@Override
	public String toString() {
		return "ID = "+id+", Name = "+name;
	}
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

Я переопределил метод toString (), чтобы напечатать некоторую полезную информацию об объекте Employee. Ниже приведен результат, полученный вышеуказанной программой.

Employee Created
Default Employee Created
ID = 999, Name = John Doe
Employee Created
Employee Created with Default Name
ID = 10, Name = John Doe
Employee Created
ID = 20, Name = Pankaj

Обратите внимание, как один конструктор вызывается из другого конструктора, это называется процессом цепочки конструкторов.

Супер Конструктор Java

Иногда класс наследуется от суперкласса, в этом случае, если нам нужно вызвать конструктор суперкласса, мы можем сделать это с помощью ключевого слова super . Давайте рассмотрим пример использования конструктора суперкласса.

Обратите внимание, что вызов суперконструктора должен быть первым оператором в конструкторе дочернего класса. Также при создании экземпляра конструктора дочернего класса java сначала инициализирует суперкласс, а затем дочерний класс. Поэтому, если конструктор суперкласса явно не вызывается, то конструктор по умолчанию или без аргументов вызывается средой выполнения java. Давайте разберемся в этих концепциях на примере какой-нибудь программы.

Давайте предположим, что у нас есть два класса, как показано ниже.

package com.journaldev.constructor;

public class Person {

	private int age;

	public Person() {
		System.out.println("Person Created");
	}

	public Person(int i) {
		this.age = i;
		System.out.println("Person Created with Age = " + i);
	}

}
package com.journaldev.constructor;

public class Student extends Person {

	private String name;

	public Student() {
		System.out.println("Student Created");
	}

	public Student(int i, String n) {
		super(i); // super class constructor called
		this.name = n;
		System.out.println("Student Created with name = " + n);
	}

}

Теперь, если мы создадим объект Student, как показано ниже;

Student st = new Student();

Какова будет произведенная продукция? Вывод вышеприведенного кода будет:

Person Created
Student Created

Таким образом, вызов перешел к конструктору без аргументов класса Student, поскольку в первом операторе не было суперзвонка, вызывается конструктор без аргументов или конструктор по умолчанию класса Person. Отсюда и вывод. Что делать, если мы используем параметризованный конструктор класса Student как Студент-студент(34, "Pankaj"); , вывод будет:

Person Created with Age = 34
Student Created with name = Pankaj

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

Конструктор копирования Java

Конструктор копирования Java принимает объект того же класса в качестве аргумента и создает его копию. Иногда нам нужна копия другого объекта, чтобы выполнить некоторую обработку. Мы можем сделать это следующими способами:

  1. реализовать клонирование
  2. предоставление служебного метода для глубокого копирования объекта.
  3. Наличие конструктора копирования

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

package com.journaldev.constructor;

import java.util.ArrayList;
import java.util.List;

public class Fruits {

	private List fruitsList;

	public List getFruitsList() {
		return fruitsList;
	}

	public void setFruitsList(List fruitsList) {
		this.fruitsList = fruitsList;
	}

	public Fruits(List fl) {
		this.fruitsList = fl;
	}
	
	public Fruits(Fruits fr) {
		List fl = new ArrayList<>();
		for (String f : fr.getFruitsList()) {
			fl.add(f);
		}
		this.fruitsList = fl;
	}
}

Обратите внимание, что Фрукты(Fruits fr) выполняет глубокое копирование, чтобы вернуть копию объекта. Давайте рассмотрим тестовую программу, чтобы понять, почему для копирования объекта лучше использовать конструктор копирования.

package com.journaldev.constructor;

import java.util.ArrayList;
import java.util.List;

public class CopyConstructorTest {

	public static void main(String[] args) {
		List fl = new ArrayList<>();
		fl.add("Mango");
		fl.add("Orange");

		Fruits fr = new Fruits(fl);

		System.out.println(fr.getFruitsList());

		Fruits frCopy = fr;
		frCopy.getFruitsList().add("Apple");

		System.out.println(fr.getFruitsList());

		frCopy = new Fruits(fr);
		frCopy.getFruitsList().add("Banana");
		System.out.println(fr.getFruitsList());
		System.out.println(frCopy.getFruitsList());

	}

}

Результатом приведенной выше программы является:

[Mango, Orange]
[Mango, Orange, Apple]
[Mango, Orange, Apple]
[Mango, Orange, Apple, Banana]

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

Это все для конструктора в java.