Конструкторы. Конструкторы по умолчанию. Вызов конструкторов класса из других конструкторов

Конструкторы. Конструкторы по умолчанию. Вызов конструкторов класса из других конструкторов


Содержание



1. Понятие конструктора по умолчанию

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

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

class ClassName
{
    ...

    // объявление конструктора
    ClassName()
    {
        // тело конструктора
        // ...
    }

    ...
}

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

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

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

class CMyClass
{
    int d;
    int GetD() { return d; }
    void SetD(int nd) { d = nd; }
}

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

// работает, так как в классе больше не реализовано ни одного конструктора
CMyClass mc = new CMyClass();

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

class CMyClass
{
    int d;

    // объявление конструктора с 1 параметром,
    // конструктор по умолчанию уже не генерируется автоматически
    CMyClass(int nd) { d = nd; }
    int GetD() { return d; }
    void Set(int nd) { d = nd; }
}

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

// ошибка компиляции, так как в классе уже объявлен другой конструктор
// CMyClass mc = new CMyClass();

CMyClass mc2 = new CMyClass(7); // а этот код работает

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

The constructor CMyClass() is undefined

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

class CMyClass
{
    int d;

    // явное объявление конструктора по умолчанию
    CMyClass() { d = 0; }

    // объявление конструктора с 1 параметром,
    CMyClass(int nd) { d = nd; }
    int GetD() { return d; }
    void Set(int nd) { d = nd; }
}

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

CMyClass mc = new CMyClass(); // вызывается конструктор по умолчанию
mc.d = 25;

CMyClass mc2 = new CMyClass(5); // вызывается конструктор с 1 параметром

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

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

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

// Класс, который реализует пиксел на экране монитора
public class CPixel
{
    // внутренние переменные класса
    private int x, y; // координаты пиксела
    private int color; // цвет пиксела

    // конструктор без параметров (конструктор по умолчанию)
    CPixel()
    {
        x = y = color = 0;
    }

    // конструктор с 2 параметрами, которые инициализируют только координаты
    CPixel(int _x, int _y)
    {
        x = _x;
        y = _y;
        color = 0;
    }

    // конструктор с 1 параметром, который инициализирует только цвет
    CPixel(int _color)
    {
        color = _color;
        x = y = 0;
    }

    // конструктор с 3 параметрами, который вызывает конструктор с 2 параметрами
    CPixel (int _x, int _y, int _color)
    {
        // вызов конструктора с 2 параметрами: обязательно первая операция и только один раз
        this(_x, _y);
        //this(_color); // повторный вызов конструктора запрещен
        this.color = _color; // так можно
    }

    // методы доступа
    int GetX() { return x; }
    int GetY() { return y; }
    int GetColor() { return color; }
}

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

...

CPixel cp1 = new CPixel(2,8); // вызов конструктора с 2 параметрами
CPixel cp2 = new CPixel(3,5,8); // вызов конструктора, который вызовет другой конструктор
int d;

d = cp1.GetX(); // d = 2
d = cp2.GetColor(); // d = 8
d = cp2.GetY(); // d = 5

...

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

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

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

5. Можно ли вызвать конструктор из обычного метода класса?

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


Связанные темы