Как сделать конструктор в java

Обновлено: 12.07.2024

Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.

В наиболее общем случае, для класса ClassName , конструктор по умолчанию имеет следующий вид:

2. В каких случаях конструктор по умолчанию генерируется в классе автоматически а в каких нет? Пример

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

Например. В следующем объявлении класса конструктор по умолчанию генерируется автоматически

Вышеприведенный код означает, что можно объявлять объект класса с использованием конструктора по умолчанию:

Если в тело класса CMyClass добавить хотя бы один другой конструктор (например, конструктор с одним параметром), то конструктор по умолчанию автоматически генерироваться не будет

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

В результате выполнения вышеприведенной строки будет выдана ошибка компиляции:

The constructor CMyClass() is undefined

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

После такой реализации можно создавать экземпляр класса с использованием двух конструкторов, например

3. Вызов конструкторов из других конструкторов. Пример

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

Пример. В примере демонстрируется использование класса CPixel , который реализует пиксел на экране монитора.

Использование класса CPixel в другом программном коде (методе)

4. Какие ограничения (требования) накладываются на вызов других конструкторов из конструктора класса?

Чтобы корректно вызвать другие конструкторы из конструктора класса, нужно придерживаться следующих требований (ограничений):

  • вызвать можно только один другой конструктор класса. Вызвать два и больше других конструктора этого класса запрещено. Это вытекает из логики, что конструктор класса предназначен для создания объекта класса только один раз (а не два и больше раза);
  • вызов другого конструктора должен быть первой операцией в вызывающем конструкторе. Если в вызывающем конструкторе вызов другого конструктора реализовать второй (третьей и т.д.) операцией, то компилятор выдаст ошибку.
5. Можно ли вызвать конструктор из обычного метода класса?

Нет, нельзя. Конструктор класса может вызваться только из другого конструктора этого же класса. Главное назначение конструктора класса – создание экземпляров (объектов) класса. Этих привилегий лишены методы класса.

Конструкторы в Java

В Java есть специальный тип метода, который называется конструктором. Конструкторы в Java используются для инициализации объекта, поэтому они вызываются в момент создания объекта.

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

Далее пример с комментариями:

// класс, описывающий точку в двумерном пространстве
class Point2D
int x; // аттрибуты класса
int y;


// конструктор по умолчанию
Point2D()
this.x = 0;
this.y = 0;
>

// конструктор с двумя параметрами
// при вызове различие происходит по параметрам - это назывется перегрузка метода
Point2D(int x, int y)
this.x = x; // устанавливаем значения для переменных
this.y = y;
>

public String toString()
return String.format("[Object Point< x = %d, y = %d >]", x, y);
>
>

// класс, описывающий точку в трехмерном пространстве
class Point3D extends Point2D
int z;

// конструктор по умолчанию
Point3D()
// инициализация родительского конструктора
// super - ссылается на родительский конструктор
super();
this.z = 0;
>

Point3D(int x, int y, int z)
super(x,y); // вызов второго родительского конструктора
this.z = z;
>

@Override
public String toString()
return String.format("[Object Point< x = %d, y = %d, z = %d >]", x, y, z);
>


// класс игрового объекта
class GameUnit
private Point2D position2d; // аттрибутом класса может быть пользовательский класс
private Point3D position3d;


// конструктор по умолчанию
GameUnit()
position2d = new Point2D();
position3d = new Point3D();
>

// конструктор с 2d точкой
GameUnit(Point2D position)
this.position2d = position; // инициализируем объект значениями
>

// конструктор с 3d точкой
GameUnit(Point3D position)
this.position3d = position;
>


// возвращает текущую 2D позицию игрового объекта
Point2D getPosition2D()
return position2d;
>

// возвращает текущую 3D позицию игрового объекта
Point3D getPosition3D()
return position3d;
>


// главный класс
public class Program
public static void main(String[] args)
Point2D startPosition = new Point2D(10,10);
GameUnit unit = new GameUnit(startPosition); // создаем объект, конструктор вызывается автоматически

// возвращаем позицию объекта x
System.out.println(unit.getPosition2D());


Point3D startPosition2 = new Point3D(10,10,20);
GameUnit unit2 = new GameUnit(startPosition2); // создаем объект, конструктор вызывается автоматически

// возвращаем позицию объекта x
System.out.println(unit2.getPosition3D());
>
>

Таким образом, если Вы уже знаете какой либо объектно-ориентированный ЯП, то понимание конструкторов в Java для Вас не станет проблемой.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 0 ):

Почти весь код, написанный на языке Java — это классы и объекты, т.к. java — объектно ориентированный язык. Java-объекты хранят свое состояние в переменных, эти переменные еще называют полями или членами экземпляра класса. Больше об объектах читайте по ссылке: Создание собственных классов в Java (продолжение), класс Object

Давайте начнем с примера:

Этот класс определяет точку с координатами X и Y.

Для того, чтобы создать экземпляр этого класса, мы должны использовать ключевое слово new.

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

От методов в java конструктор отличается тем, что имеет то же самое имя, что и класс, в котором он определен, а также не имеет типа возвращаемого значения. Конструктор в java возвращает новый объект — экземпляр родительского класса). Больше о конструкторах читайте по ссылке: Создание собственных классов в Java: свойства, методы, конструкторы

Мы можем определить наш собственный конструктор. Поскольку методы можно перегружать, а конструктор является методом, то с помощью перегрузки можно создать дополнительные варианты конструкторов. Например, удобно иметь конструктор, который позволит при создании объекта Point явно указывать его координаты:

На предыдущем занятии мы увидели как объявляются классы и создаются их экземпляры с помощью оператора:

ссылка = new имя_класса();

В частности, вот такой строчкой:

создавали объект класса Point:

В действительности, в момент создания объекта всегда происходит вызов специального метода (функции) класса, который называется конструктор:


Но у нас в классе Point нет никаких методов, там объявлены только две переменные x, y. Все так, но в Java в любой класс автоматически добавляет конструктор по умолчанию, если явно не записаны никакие другие конструкторы. Именно этот конструктор по умолчанию и вызывался при создании объектов класса Point.

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

имя_класса([аргументы]) <
// тело конструктора (набор операторов)
>

И в нашем случае его можно прописать так:

Смотрите, мы указываем, что при создании нового экземпляра класса, значения полей x, y будут равны -1. Проверим это, создадим объект и выведем значения координат в консоль:

Отображаются -1. Это как раз следствие работы конструктора, который мы прописали в классе. При этом, конструктор по умолчанию больше не существует и остается только тот, что мы указали.

А что если мы захотим прописать два конструктора и к существующему добавить еще один:

Так тоже можно делать. Теперь наш класс содержит оба конструктора и мы можем вызывать любой из них при создании объектов:

Это называется перегрузкой конструкторов, когда в одном классе несколько конструкторов с разными аргументами. На практике это используется довольно часто.

Ключевое слово this

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

Очевидно, что здесь x, y будут восприниматься как локальные аргументы и никакого отношения к переменным класса x, y они не будут иметь. Но, можно ли как то явно указать, что мы хотим обратиться именно к полям объекта, а не к аргументам конструктора? Да, можно, и делается это с помощью специального ключевого слова this:

По смыслу this – это ссылка на текущий экземпляр объекта. То есть, если нам внутри самого объекта требуется оперировать ссылкой на него, то для этого используется ключевое слово this. Мало того, через this можно вызывать один конструктор из другого. Например, добавим в класс Point еще одно поле color – цвет точки. И будем по умолчанию инициализировать его нулем:

Смотрите что получается. У нас конструкторах происходит дублирование кода. Это плохой стиль программирования. Чтобы этого избежать, можно во втором конструкторе вызвать сначала первый для начальной инициализации полей, а затем, изменить значения координат x, y:

Вот эта строчка this(); как раз выполняет вызов первого конструктора перед изменением полей x, y. В результате, никакого дублирования не происходит. Вот так двояко можно применять ссылку this: и для доступа к полям текущего объекта, и для вызова конструкторов.

Инициализаторы

Давайте еще раз внимательно посмотрим на пример нашего класса и зададимся вопросом: что делает первый конструктор без аргументов? Фактически, он выполняет начальную инициализацию полей класса Point. Именно поэтому мы его отдельно вызываем во втором конструкторе. Но это не лучший ход. В классах языка Java можно создавать специальный блок, который так и называется – инициализатор. Он автоматически выполняется один раз при создании объекта до вызова конструкторов. Записывается инициализатор следующим образом:

Смотрите, здесь в отдельном блоке задаются начальные значения всех переменных класса, а затем, отдельно вызываются конструкторы. При этом, вызывать первый конструктор из второго уже нет необходимости – данные уже инициализированы указанными значениями. Это очень удобно.

Глядя на первый конструктор, в котором нет никакой реализации, возникает соблазн его попросту убрать из класса Point. Давайте попробуем это сделать и посмотрим к чему это приведет:

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

Путь кодера

Подвиг 1. Объявить класс Rect для представления прямоугольника, в котором хранятся две координаты: верхнего левого и правого нижнего углов. Реализовать три конструктора: первый – без аргументов; второй с четырьмя аргументами для двух координат; третий – с четырьмя аргументами (координата левого верхнего угла, ширина и высота). Создать несколько экземпляров с вызовом разных конструкторов и выводом значений полей в консоль.

Подвиг 2. Объявить класс Triangle, хранящий три координаты вершин. Координаты представить в виде ссылок на класс Point, который рассмотрен на этом занятии. Реализовать два конструктора: без аргументов и с шестью аргументами (по два на каждую координату). Создать два объекта, вывести координаты вершин по каждому объекту в консоль.

Подвиг 3. Объявить класс Line для представления линии на плоскости, хранящий две координаты: начало и конец линии. Создать два объекта этого класса и в функции main() определить: пересекаются ли эти две линии.

Видео по теме



















© 2022 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Читайте также: