Что такое конструктор в Java и как его использовать?

В объектно-ориентированном программировании конструктор – это специальная функция, которую вы вызываете для создания объекта. У конструкторов есть несколько уникальных функций, которые позволяют им работать.

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

Зачем вообще нужны конструкторы?

Конструкторы – это основа объектно-ориентированного программирования , и Java не исключение. В этом примере показано, как определить базовый класс Circle с одним свойством данных и одним методом:

 public class Circle {
public double radius;
public double area() { return 3.14159 * radius * radius; }
}

Затем вы можете создать экземпляр этого класса и взаимодействовать с ним:

 Circle c = new Circle();
c.radius = 2;
System.out.println(c.area()); // 12.56636

Но это менее удобно и надежно, чем могло бы быть. Хорошая объектно-ориентированная практика – инкапсулировать данные, защищая их от несанкционированного доступа:

 public class Circle {
private double radius;
public double area() { return 3.14159 * radius * radius; }
public void setRadius(double r) { radius = r; }
}

Теперь вызывающий код может использовать метод setRadius и не беспокоиться о деталях его реализации:

 Circle c = new Circle();
c.setRadius(2);

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

Примеры простых конструкторов

Самый простой конструктор – это конструктор без аргументов, который ничего не делает:

 public class Circle {
public Circle() {}
}

См. Также: Узнайте, как создавать классы в Java.

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

Обратите внимание на пару вещей:

  1. Имя конструктора совпадает с именем класса.
  2. Этот конструктор использует модификатор общего доступа, поэтому любой другой код может его вызвать.
  3. Конструктор не включает возвращаемый тип. В отличие от других методов, конструкторы не могут возвращать значение.

Конструкторы обычно выполняют какую-то инициализацию. Обратите внимание, что приведенный выше код не инициализирует значение радиуса. В этом случае язык автоматически установит его на ноль. Этот класс ожидает, что пользователь будет использовать setRadius () . Чтобы использовать более полезное значение по умолчанию, чем 0, вы можете назначить его в конструкторе:

 public class Circle {
public Circle() { radius = 1; }
}

У кругов, созданных с помощью этого класса, по крайней мере, теперь будет фактическая площадь! Вызывающий по-прежнему может использовать setRadius () для предоставления радиуса, отличного от 1. Но конструктор может быть еще более дружелюбным:

 public class Circle {
public Circle(double r) { radius = r; }
}

Теперь вы можете создавать круги с определенным радиусом прямо с рождения:

 Circle c = new Circle(2);
System.out.println(c.area()); // 12.56636

Это очень распространенное использование конструкторов. Вы часто будете использовать их для инициализации переменных значениями параметров.

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

Вы можете указать более одного конструктора в определении класса:

 public Circle() { radius = 1; }
public Circle(double r) { radius = r; }

Это дает вызывающему коду возможность выбора способа создания объектов:

 Circle c1 = new Circle(2);
Circle c2 = new Circle();
System.out.println(c1.area() + ", " + c2.area()); // 12.56636, 3.14159

С немного более сложным Кругом вы можете исследовать более интересные конструкторы. Эта версия хранит свою позицию:

 public class Circle {
public double x, y, radius;
public Circle() { radius = r; }
public Circle(double r) { radius = r; }
public Circle(double x, double y, double r) {
this.x = x; this.y = y; radius = r;
}

public double area() { return 3.14159 * radius * radius; }
}

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

Конструктор цепочки

Как насчет создания одного круга на основе другого? Это дало бы нам возможность легко копировать круги. Соблюдайте следующий блок:

 public Circle(Circle c) {
this.x = cx;
this.y = cy;
this.radius = c.radius;
}

Это будет работать, но будет повторяться какой-то код без надобности. Поскольку в классе Circle уже есть конструктор, который обрабатывает отдельные свойства, вы можете вызвать его вместо этого, используя ключевое слово this :

 public Circle(Circle c) {
this(cx, cy, c.radius);
}

Это одна из форм цепочки конструкторов, вызывающая один конструктор из другого. Он использует меньше кода и помогает централизовать операцию, а не дублировать ее.

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

Другая форма объединения конструкторов возникает, когда конструктор вызывает конструктор своего родительского класса. Это может быть явное или неявное. Чтобы явно вызвать родительский конструктор, используйте ключевое слово super :

 super(x, y);

Представьте себе класс Shape, выступающий в роли родителя Circle:

 public class Shape {
double x, y;
public Shape(double _x, double _y) { x = _x; y = _y; }
}

Он обрабатывает общее позиционирование для всех форм, поскольку это общая функциональность. Теперь класс Circle может делегировать обработку позиции своему родителю:

 public class Circle extends Shape {
double radius;
public Circle(double r) { super(0, 0); radius = r; }
public Circle(double x, double y, double r) {
super(x, y);
radius = r;
}
}

Создание суперкласса – очень важный аспект наследования в Java . Язык применяет это по умолчанию, если вы явно не вызываете super в своих конструкторах.

Модификаторы доступа к конструкторам

Конструкторы могут включать в свою подпись модификатор доступа. Как и другие методы, это определяет, какие типы вызывающих могут получить доступ к конструктору:

 public class Test {
private static Test uniqueInstance = new Test();
private Test() { }
public static Test getInstance() {
return uniqueInstance;
}
}

Это более сложный пример, поэтому постарайтесь понять его:

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

Используйте конструкторы в Java для создания объектов

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

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