Конструкторы Java — это специальные конструкции, подобные методам, которые позволяют полностью инициализировать состояние объекта, прежде чем другие классы внутри приложения смогут его использовать. Конструкторы вызываются с помощью ключевого слова new.
1. Что такое конструктор в Java?
Конструкторы — это специальные конструкции, похожие на методы(но не совсем методы), которые помогают программистам писать код инициализации объекта, прежде чем объект станет доступен для использования другими объектами в приложении.
public class MyClass {public MyClass() {//...}}
Всякий раз, когда приложению требуется новый экземпляр любого класса, JVM выделяет область памяти внутри кучи. Затем JVM выполняет вызванный конструктор(класс может иметь несколько конструкторов) и инициализирует состояние объекта. Внутри конструктора мы можем получить доступ ко всем атрибутам объекта и назначить им значения по умолчанию или желаемые значения.
Если мы не определим ни одного конструктора в классе, JVM автоматически вставит конструктор по умолчанию с пустым телом.
2. Правила создания конструкторов в Java
Существует несколько обязательных правил создания конструкторов в Java.
- Имя конструктора ДОЛЖНО совпадать с именем класса.
- В определении конструктора не может быть никакого возвращаемого типа.
- В конструкторе не может быть оператора return.
- Конструкторы могут быть перегружены различными аргументами.
- Если вы хотите использовать super(), т.е. конструктор родительского класса, то это должен быть первый оператор внутри конструктора.
3. Конструкторы по умолчанию и параметризованные конструкторы
Конструкторы могут быть двух типов. Один, который не принимает аргументов, также называется конструктором по умолчанию. Другие конструкторы, которые принимают аргументы, называются параметризованными конструкторами.

3.1 Конструктор по умолчанию
Если мы не предоставляем ни одного конструктора в классе, JVM предоставляет классу конструктор по умолчанию во время компиляции. В конструкторе по умолчанию имя конструктора ДОЛЖНО совпадать с именем класса, и он не должен иметь никаких параметров.
публичный класс Сотрудник {публичный Сотрудник() {супер();}}
Обратите внимание, что мы также можем переопределить конструктор по умолчанию и добавить больше кода, связанного с инициализацией состояния.
публичный класс Сотрудник {публичный Сотрудник() {//дополнительные заявленияэтот.возраст = рассчитатьВозрастОтДатыРождения();}}
3.2 Параметризованный конструктор
В классе может быть несколько конструкторов. Мы можем определить перегруженные конструкторы в классе, который принимает разный набор параметров в каждом конструкторе.
public class Employee {private String firstName;private String lastName;public Employee() { //constructor 1}public Employee(String firstName) { //constructor 2//statements}public Employee(String firstName, String lastName) { //constructor 3//statements}}
Если мы определяем не параметризованный конструктор по умолчанию в классе, то JVM не вставит конструктор по умолчанию в байт-код. В таком случае, если требуется конструктор по умолчанию, мы должны явно создать конструктор по умолчанию.
Например, в следующем классе Employee мы создали только один параметризованный конструктор:
class Employee {public Employee(String name) {}}
Если мы попытаемся создать экземпляр Employee с помощью конструктора по умолчанию, то возникнет ошибка компиляции:
Employee employee = new Employee(); //'Employee(java.lang.String)' in 'Employee' cannot be applied to '()'
4. Цепочка конструкторов с помощью this() и super()
В Java можно вызывать другие конструкторы внутри конструктора. Это похоже на вызов метода, но без какой-либо ссылочной переменной(очевидно, поскольку экземпляр НЕ полностью инициализирован на данный момент).
Теперь мы можем вызывать конструкторы как того же класса, так и родительского класса. Оба используют разный синтаксис.
4.1 Вызов конструкторов одного класса с помощью this()
Чтобы вызвать другие конструкторы из того же класса, используйте это ключевое слово. В следующем коде this() вызывает конструктор по умолчанию, а this(firstName) вызывает первый конструктор, принимающий один аргумент типа String.
public Employee() {}public Employee(String firstName) {this(); //calling default constructor}public Employee(String firstName, String lastName) {this(firstName); //calling constructor with single argument of String type}
4.2 Вызов конструкторов родительского класса с помощью super()
Для вызова конструкторов из супер или родительского класса используйте ключевое слово super. Использование ключевого слова super похоже на это ключевое слово — единственное отличие в том, что super относится к суперклассу, а this относится к текущему экземпляру.
public class Parent {public Parent() {//...}}public class Child extends Parent {public Child() {super(); //invokes Parent's constructor}}
5. Частные застройщики
Иногда мы хотим защитить конструктор от вызова другими классами. В целом мы хотим, чтобы никто не мог создать новый экземпляр класса.
Зачем это кому-то нужно? Ну, это необходимо для шаблона singleton. В singleton приложение хочет иметь один и только один экземпляр любого класса.
Общее определение класса-синглтона выглядит следующим образом:
public class DemoSingleton implements Serializable{private static final long serialVersionUID = 1L;private DemoSingleton() {// private constructor}private static class DemoSingletonHolder {public static final DemoSingleton INSTANCE = new DemoSingleton();}public static DemoSingleton getInstance() {return DemoSingletonHolder.INSTANCE;}protected Object readResolve() {return getInstance();}}
Вот и все о конструкторах в Java. Пишите мне свои вопросы в комментариях.