У овом упутству ћемо научити о замени метода у Јави уз помоћ примера.
У последњем упутству сазнали смо о наслеђивању. Наслеђивање је ООП својство које нам омогућава да изведемо нову класу (поткласу) из постојеће класе (суперкласу). Подкласа наслеђује атрибуте и методе суперкласе.
Сада, ако је иста метода дефинисана и у суперкласи и у подкласи, тада метода класе подкласе замењује методу суперкласе. Ово је познато као замена метода.
Пример 1: Замена методе
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( @Override public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Излаз :
Ја сам пас.
У горњем програму, displayInfo()
метода је присутна и у суперкласи Анимал и у подкласи Дог.
Када зовемо displayInfo()
помоћу објекта д1 (објекта подкласе), позива се метода унутар подкласе Дог. displayInfo()
Метода поткласе замењује исти метод суперкласна.
Обратите пажњу на употребу @Override
напомене у нашем примеру. У Јави су напомене метаподаци које смо користили за пружање информација компајлеру. Овде @Override
напомена наводи компајлер да метода након ове напомене надјачава метод суперкласе.
Није обавезна за употребу @Override
. Међутим, када ово користимо, метода треба да следи сва правила надјачавања. У супротном, компајлер ће генерисати грешку.
Правила замене Јава
- И суперкласа и подкласа морају имати исто име методе, исти тип повратка и исту листу параметара.
- Не можемо да заменимо методу декларисану као
final
иstatic
. - Увек би требало да заменимо апстрактне методе суперкласе (о којима ће бити речи у каснијим туторијалима).
супер кључна реч у замени Јава-а
Уобичајено питање које се поставља током извршавања замене у Јави је:
Можемо ли приступити методи суперкласе након замене?
Па, одговор је Да . Да бисмо приступили методи суперкласе из подкласе, користимо super
кључну реч.
Пример 2: Употреба супер кључне речи
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( super.displayInfo(); System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Излаз :
Ја сам животиња. Ја сам пас.
У горњем примеру, подразред Пас надјачава метод displayInfo()
суперкласе Животиња.
Када методу позивамо displayInfo()
помоћу објекта д1 подкласе Дог, позива се метода унутар подкласе Дог; метода унутар суперкласе се не позива.
Унутар displayInfo()
подкласе Пас, некада super.displayInfo()
смо називали displayInfo()
суперкласу.
Важно је напоменути да се конструктори у Јави не наслеђују. Дакле, у Јави не постоји ствар која замењује конструктор.
Међутим, конструктор суперкласе можемо назвати из његове подкласе. За то користимо super()
. Да бисте сазнали више, посетите Јава супер кључну реч.
Специфичари приступа у замени метода
Иста метода декларисана у суперкласи и њеним подкласама може имати различите спецификаторе приступа. Међутим, постоји ограничење.
Спецификаторе приступа можемо да користимо само у поткласама које пружају већи приступ од спецификатора приступа суперкласе. На пример,
Претпоставимо да myClass()
је декларисана метода у суперкласи protected
. Затим, иста метода myClass()
у поткласи може бити public
или protected
, али не private
.
Пример 3: Спецификатор приступа у замени
class Animal ( protected void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Излаз :
Ја сам пас.
У горњем примеру, подразред Пас надјачава метод displayInfo()
суперкласе Животиња.
Кад год позовемо displayInfo()
користећи д1 (објекат поткласе), позива се метода унутар подкласе.
Приметите да displayInfo()
је декларирано protected
у суперкласи Анимал. Исти метод има public
спецификатор приступа у подкласи Дог. То је могуће јер public
пружа већи приступ од protected
.
Надјачавање апстрактних метода
У Јави су апстрактне класе створене да буду суперкласа осталих класа. А, ако класа садржи апстрактни метод, обавезно га је надјачати.
У каснијим туторијалима сазнаћемо више о апстрактним часовима и замени апстрактних метода.