В този урок ще научим за замяна на метода в 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 абстрактните класове са създадени, за да бъдат суперклас на други класове. И ако класът съдържа абстрактен метод, е задължително да го замените.
Ще научим повече за абстрактните класове и заместването на абстрактните методи в следващите уроци.