Назад Зміст Вперед

7.4. Перевизначення методів

Якщо в ієрархії класів співпадають імена і типи методів із підкласу і суперкласу, то говорять що метод із підкласу перевизначає метод суперкласу. Якщо перевизначений метод викликається із свого підкласу, він завжди посилається на свій варіант, визначений в підкласі. А варіант методу, визначений в суперкласі буде скритий.

Зверніть увагу: перевизначення підлягають тільки нестатичні методи
Наприклад:
class А {
int i , j ;
A (int а, int b) {
i = а;
j = b;
//вивести значення змінних i та j
void show ( ) {
System.out.println ("i та j: " + i + " " + j ) ;
class В extends А {
int k ;
В ( int а, int b, int с ) {
super ( а, b ) ;
k = с ;
//вивести значення змінної k за допомогою методу,
//який перевизначає метод show( ) із класу А
void show( ) {
System.out.println( " k : " + k ) ;
class Override {
pubic static void main ( S t r i n g a r 
g s [ ] ) {
В subOb = new B (l,2,3);
subOb.show( ) ; //тут викликається метод show ( ) иіз класу В


Результат:k : 3

Перевантаження (overloading) методу - під цим терміном розуміється створення декількох методів з однаковими іменами, але з різними сигнатурами, за якими ці методи відрізняються один від одного.

Перевизначення (overriding) методу означає, що реалізація методу, взята з суперкласу, замінюється вашою власною, сигнатури методів при цьому повинні бути ідентичними. Зверніть увагу: перевизначенню підлягають тільки нестатичні методи.

Правила перевизначення методу наступні:

  • Список аргументів мусить точно співпадати з перевизначеним методом. Якщо вони не співпадають, ви можете закінчити перевантаженим методом, який ви не включили.
  • Тип повернення має бути той же або підтип типу повернення, оголошеного в оригінальному перевизначеному методі надкласу.
  • Рівень доступу не може бути більш строгим ніж до перевизначення.
  • Рівень доступу Може бути менш строгим.
  • Методи екземплярів можуть бути перевизначені тільки якщо вони були успадковані підкласом. Підклас в одному пакеті, що і суперклас екземпляру може перевизначати всі методи суперкласу, що не позначені private чи final. Підклас в різних пакетах може перевизначати тільки некінцеві методи, позначені public чи protected (оскільки захищені методи успадковуються підкласом).
  • Перевизначення методу може давати будь-яке виключення виконання, незалежно від того, чи оголошує це виключення перевизначений метод. 
  • Метод, що перевизначає не має видавати виключення, що є нові чи сторонні відносно тих, які оголошені перевизначеним методом. Для прикладу, метод оголошує filenotfoundexception, то не може бути перевизначеним методом, що оголошує sqlexception, Exception, чи інші виключення, якщо це не підклас filenotfoundexception.
  • Метод, що перевизначає може видавати вузькі виключення. Він не має оголошувати виключення, які ніколи не видадуться, незалежно від того, що оголошує перевизначений метод.
  • Ви не можете перевизначати метод, позначений final. Ви не можете перевизначати статичні методи. 
  • Якщо метод не може бути успадкований, ви не можете перевизначити його. Пам'ятайте, що превизначення відбувається при перевиконанні методу, який ви успадкували.
.