Конструктори. Конструктори за замовчуванням. Виклик конструкторів класу з інших конструкторів
Зміст
- 1. Що називається конструктором за замовчуванням?
- 2. У яких випадках конструктор за замовчуванням генерується у класі автоматично а в яких ні? Приклад
- 3. Виклик конструкторів з інших конструкторів. Приклад
- 4. Які обмеження (вимоги) накладаються на виклик інших конструкторів з конструктора класу?
- 5. Чи можна викликати конструктор зі звичайного методу класу?
- Зв’язані теми
Пошук на інших ресурсах:
1. Що називається конструктором за замовчуванням?
Конструктор за замовчуванням (default constructor) – це конструктор, що не має параметрів. Конструктор за замовчуванням може оголошуватись у класі явним чином або генеруватись автоматично.
У найбільш загальному випадку, для класу ClassName, конструктор за замовчуванням має такий вигляд:
class ClassName { ... // оголошення конструктора ClassName() { // тіло конструктора // ... } ... }
2. У яких випадках конструктор за замовчуванням генерується у класі автоматично а в яких ні? Приклад
Якщо у класі не оголошувати жодного конструктора, то, буде генеруватись конструктор за замовчуванням. Тобто, конструктор за замовчуванням генерується у класі автоматично тільки у тому випадку, якщо клас не містить реалізації інших конструкторів. Якщо клас містить реалізацію хоча б одного конструктора з параметрами, то, щоб оголосити конструктор за замовчуванням, його потрібно оголошувати в класі явним чином.
Наприклад. У наступному оголошенні класу конструктор за замовчуванням генерується автоматично
class MyClass { 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 SetD(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 SetD(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. Чи можна викликати конструктор зі звичайного методу класу?
Ні, не можна. Конструктор класу може викликатись тільки з іншого конструктора цього ж класу. Головне призначення конструктору класу – створювати екземпляри (об’єкти) класу. Методи класу не мають таких привілеїв.
Зв’язані теми
- Конструктори. Параметризовані конструктори. Ключове слово this. Збір “сміття”. Метод finalize(). Приклади
- Перевантаження методів у класах. Перевантаження конструкторів