На відміну від попереднього випадку, конструктору суперкласу передається аргу- мент, який привласнюється як значення полю number. Як і раніше, зна- чення поля відображається за допомогою методу суперкласу showA ().
Конструктор підкласу також має аргумент. Значення аргументу прісваіва- ється полю number. певного безпосередньо в класі. Однойменне нас- ледуемое поле отримує значення, на одиницю менше аргументу конструктора. Для цього викликається конструктор суперкласу з відповідним аргументом. При виконанні конструктора підкласу також виводиться повідомлення про значен ня двох полів, причому звернення до полю, визначеному в підкласі, виконан вується по імені number. а звернення до полю, визначеному в суперкласі, через інструкцію super.number. Значення обох полів можна вивести на екран за допомогою методу showB ().
Головний метод програми містить команду створення об'єкта підкласу, команду зміни значення поля number. визначеного в підкласі (інструкцією obj.number = 10), а також команди виведення значень полів за допомогою методів showA () і showB (). В результаті виконання цієї програми отримуємо наступне:
Створено об'єкт суперкласу з полем 4 Створено об'єкт з полями: 4 і 5
Поля об'єкта 4 і 10
За тим же принципом, що і заміщення полів з однаковими іменами, заміщуються і методи з однаковими сигнатурами. Однак з методами ситуація дещо складніша, оскільки існує такий механізм, як перевантаження методів. Крім перевантаження важливим поняттям є перевизначення методів.
Дивуюся вашої принциповості. То ви за правління, то проти!
Як уже зазначалося, якщо в підкласі описаний метод з сигнатурою, що збігається з сигнатурою методу, успадкованого з суперкласу, то метод підкласу заміщає метод суперкласу. Іншими словами, якщо викликається відповідний метод, то використовується та його версія, яка описана безпосередньо в підкласі. При цьому старий метод з суперкласу стає доступним, якщо до нього звернутися в форматі посилання з використанням ключового слова super.
Між перевизначенням і перевантаженням методів існує принципова відмінність. При перевантаженні методи мають однакові назви, але різні сигнатури. При перевизначенні збігаються не тільки назви методів, але
В результаті виконання програми отримуємо послідовність повідомлень:
Об'єкт №1 створено! Об'єкт №2 створено! Для об'єкта №1:
Поле number: 10 Для об'єкта №2: Поле number: -20 Поле symbol: a Для об'єкта №2: Поле number: 100 Поле symbol: a Для об'єкта №2: Поле number: 0 Поле symbol: z
Розберемо програмний код і результат його виконання. У програмі описується клас ClassA (суперклас), на основі якого створюється підклас ClassB. Клас ClassA має целочисленное поле number. статичне целочисленное поле count (ініціалізувати нульовим значенням) і закрите целочисленное поле code. Крім цього, в класі описаний конструктор з одним аргументом (значенням поля number), метод set () з одним аргументом для надання значення полю number. а також метод show () для відображення значення поля number.
Статичне поле count призначене для обліку кількості створених об'єктів. При створенні чергового об'єкта класу значення цього лічильника збільшується на одиницю. Для цього в конструкторі класу ClassA розміщена команда count ++. Крім цього в конструкторі за допомогою методу set () присвоюється значення полю number (як аргумент методу передається аргумент конструктора), а командою code = count присвоюється значення закритому полю code. В поле code записується порядковий номер, під яким створено відповідний об'єкт. Поле count для цієї мети не підходить, оскільки воно статичне і змінюється кожен раз при створенні чергового об'єкта. В поле code записується значення поля count після створення об'єкта і згодом поле code цього об'єкта не змінюється.
Перевизначення методів при спадкуванні
Поле code (після надання значення полю) служить в конструкторі для виведення повідомлення про створення об'єкта з відповідним номером. Номер об'єкта (поле code) використовується також в методі show (). щоб легше було простежити, для якого саме об'єкту виводиться інформація про значення поля number.
Підклас ClassB створюється на основі суперкласу ClassA. У підкласі ClassB успадковується статичне поле count та поле number. Закрите поле code не успадковується. Крім цих успадкованих полів, безпосередньо в класі ClassB описано символьне поле symbol. Конструктор класу приймає два аргументи: перший типу int для поля number і другий типу char для поля symbol.
Код конструктора класу ClassB складається всього з двох команд: команди виклику конструктора суперкласу super (n) і команди присвоювання значення символьному полю symbol = s (n і s - аргументи конструктора). З другою командою все просто і зрозуміло. Інтерес представляє команда виклику конструктора суперкласу. По-перше, цим конструктором успадкованого полю number присвоюється значення. По-друге, значення успадкованого статичного поля count збільшується на одиницю. Це означає, що ведеться загальний облік всіх об'єктів, як суперкласу, так і підкласу. По-третє, хоча поле code не успадковується, під нього виділяється місце в пам'яті і туди заноситься порядковий номер створеного об'єкта. На екран виводиться повідомлення про створення нового об'єкта, а номер об'єкта зчитується з «неіснуючого» поля code.
Метод show () в класі ClassB переопределяется. Сигнатура описаного в класі ClassB методу show () збігається з сигнатурою методу show (). описаного в класі ClassA. Якщо в класі ClassA методом show () відображається інформація про номер об'єкта і значення його поля number. то в класі ClassB метод show () виводить ще й значення поля symbol. При цьому в перевизначення методі show () викликається також колишня (вихідна) версія методу з класу ClassA. Для цього використовується інструкція виду super.show (). Цей вихідний варіант методу, крім іншого, зчитує з неуспадковане (але реально існуючого) поля code порядковий номер об'єкта і відображає його в виведеному на екран повідомленні.
Метод set () в класі ClassB перевантажується. Хоча в класі ClassA є метод з такою ж назвою, сигнатури методів в суперкласі і підкласі різні. У суперкласі у методу set () один числовий аргумент, а в підкласі у цього методу два аргументи: числовий і символьний. Тому в класі ClassB є два варіанти методу set () - з одним і двома аргументами. Перший успадковується з суперкласу ClassA. а другий визначено безпосередньо в підкласі
У головному методі програми командами ClassA objA = new ClassA (10) і ClassB objB = new ClassB (-20, 'a') створюються два об'єкти: об'єкт objA суперкласу і об'єкт objB підкласу. В результаті виконання цих команд на екрані з'являються повідомлення Об'єкт №1 створено! і Об'єкт №2 створено! - повідомлення виводяться конструкторами. Перевіряються значення полів створених об'єктів командами objA.show () і objB.show (). Оскільки метод show () перевантажений, то в першому випадку