Пример конструктора Java: по умолчанию и с параметрами

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

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

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

public class MyClass {public MyClass() {//...}}

Всякий раз, когда приложению требуется новый экземпляр любого класса, JVM выделяет область памяти внутри кучи. Затем JVM выполняет вызванный конструктор(класс может иметь несколько конструкторов) и инициализирует состояние объекта. Внутри конструктора мы можем получить доступ ко всем атрибутам объекта и назначить им значения по умолчанию или желаемые значения.

Если мы не определим ни одного конструктора в классе, JVM автоматически вставит конструктор по умолчанию с пустым телом.

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

Существует несколько обязательных правил создания конструкторов в Java.

  • Имя конструктора ДОЛЖНО совпадать с именем класса.
  • В определении конструктора не может быть никакого возвращаемого типа.
  • В конструкторе не может быть оператора return.
  • Конструкторы могут быть перегружены различными аргументами.
  • Если вы хотите использовать super(), т.е. конструктор родительского класса, то это должен быть первый оператор внутри конструктора.

3. Конструкторы по умолчанию и параметризованные конструкторы

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

Java-конструктор

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. Пишите мне свои вопросы в комментариях.

Прокрутить вверх