Замяна на метода на Java

В този урок ще научим за замяна на метода в Java с помощта на примери.

В последния урок научихме за наследяването. Наследяването е OOP свойство, което ни позволява да извлечем нов клас (подклас) от съществуващ клас (суперклас). Подкласът наследява атрибутите и методите на суперкласа.

Сега, ако един и същ метод е дефиниран както в суперкласа, така и в подкласа, тогава методът на класа на подкласа заменя метода на суперкласа. Това е известно като заместване на метода.

Пример 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()методът присъства както в суперкласа Animal, така и в подкласа Dog.

Когато извикваме displayInfo()с помощта на обекта d1 (обект на подкласа), се извиква методът в подкласа Dog. В displayInfo()метода на подкласа отменя същия метод на суперкласа.

Забележете използването на @Overrideанотацията в нашия пример. В Java анотациите са метаданните, които използвахме за предоставяне на информация на компилатора. Тук @Overrideанотацията указва компилатора, че методът след тази анотация заменя метода на суперкласа.

Не е задължително да се използва @Override. Когато обаче използваме това, методът трябва да следва всички правила за отмяна. В противен случай компилаторът ще генерира грешка.

Правила за замяна на Java

  • И суперкласът, и подкласът трябва да имат едно и също име на метод, един и същ тип връщане и един и същ списък с параметри.
  • Не можем да заменим метода, деклариран като finalи static.
  • Винаги трябва да отменяме абстрактните методи на суперкласа (ще бъдат обсъдени в следващите уроци).

супер ключова дума в Java Замяна

Често срещан въпрос, който възниква при извършване на заместване в Java, е:

Можем ли да получим достъп до метода на суперкласа след заместване?

Е, отговорът е да . За достъп до метода на суперкласа от подкласа използваме 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(); ) ) 

Изход :

Аз съм животно. Аз съм куче.

В горния пример подкласът Dog отменя метода displayInfo()на суперкласа Animal.

Когато извикаме метода, displayInfo()използвайки обекта d1 на подкласа Dog, се извиква методът вътре в подкласа Dog; методът в суперкласа не се извиква.

Вътре displayInfo()в подкласа Dog сме свикнали super.displayInfo()да наричаме displayInfo()суперкласа.

Важно е да се отбележи, че конструкторите в Java не се наследяват. Следователно в Java няма такова нещо като замяна на конструктора.

Въпреки това можем да извикаме конструктора на суперкласа от неговите подкласове. За това използваме super(). За да научите повече, посетете Java супер ключова дума.

Достъп до спецификатори в метод за замяна

Същият метод, деклариран в суперкласа и неговите подкласове, може да има различни спецификатори за достъп. Има обаче ограничение.

Можем да използваме само тези спецификатори за достъп в подкласове, които осигуряват по-голям достъп от спецификатора за достъп на суперкласа. Например,

Да предположим, 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(); ) ) 

Изход :

 Аз съм куче. 

В горния пример подкласът Dog отменя метода displayInfo()на суперкласа Animal.

Винаги, когато извикаме displayInfo()с помощта на d1 (обект на подкласа), се извиква методът вътре в подкласа.

Забележете, че displayInfo()е декларирано protectedв суперкласа на животните. Същият метод има publicспецификатора за достъп в подкласа Dog. Това е възможно, тъй като publicпредоставя по-голям достъп от protected.

Отменящи абстрактни методи

В Java абстрактните класове са създадени, за да бъдат суперклас на други класове. И ако класът съдържа абстрактен метод, е задължително да го замените.

Ще научим повече за абстрактните класове и заместването на абстрактните методи в следващите уроци.

Интересни статии...