Спадкування та конструктор за замовчуванням
Основи мови Java
Підкажіть, будь ласка, не можу зрозуміти логіки. Є клас А
Як написано в книзі: Якщо у класу немає конструктора то компілятор сам створює конструктор за замовчуванням як у предка.
Але як сказано в тій же книжці, якщо я створюю якийсь конструктор то конструктор за замовчуванням не створюється. Так якого ж тоді для другого класу компілятор його намагається створити?
1. Якщо Ви створюєте клас і в ньому визначаєте конструктор з аргументами (клас AClass, який має лише один конструктор, який приймає int i), то компілятор вже не створить конструктор за замовчуванням. Тому що це порушило б контракт класу AClass, який може бути ініціалізований без аргументів. Якщо Ви хочете ще мати і конструктор за умовчанням, ставте тепер його явно.
Інакше не можна було заборонити створення конструктора за умовчанням, що було погано.
2. При створенні конструкторів класу BClass, який успадковується від іншого класу, компілятор вимагає, щоб першим рядком конструктора був виклик іншого конструктора (успадкованого або у цьому класі).
Чому? Тому що раз Ви успадкуєте від якогось класу, Ви хочете повторно використовувати його логіку. Конструктор наводить екземпляр класу в якийсь початковий цілісний стан. У Вашому випадку для ініціалізації AClass вимагає аргументу, без якого JVM не знає, як ініціалізувати екземпляр класу.
Якщо класу не визначено конструктори, він намагається створити конструктор за умовчанням, тобто. без аргументів:
Оскільки тут явно конструктори не визначені, І клас не успадковується від інших класів, компілятор створює конструктор за замовчуванням.
Це еквівалентно такому визначенню:
Тепер подивимося на BClass1:
Тут тежявно конструктори не визначено, і компілятор намагається створити конструктор за умовчанням. Оскільки в класі AClass1 є конструктор за замовчуванням, він створить конструктор за замовчуванням, який викликатиме конструктор AClass1. Цей код еквівалентний такому:
У Вашому випадку створюється клас БЕЗ конструктора за замовчуванням:
Оскільки тут описаний (хоч би один) конструктор, конструктор за умовчанням не створюється. Т. е. такий код вже не буде компілюватися:
потрібно щось на зразок
Відповідно, будь-який конструктор BClass вимагатиме виклику будь-якого конструктора AClass або BClass. При такому описі компілятор лаятиметься:
Тому що буде спроба виклику конструкора за умовчанням класу AClass, який не визначено:
Тим не менш, можна створити клас BClass з конструктором за замовчуванням, задавши якесь значення для конструктора AClass: