I den här handledningen lär vi oss om metodöverstyrning i Java med hjälp av exempel.
I den senaste handledningen lärde vi oss om arv. Arv är en OOP-egenskap som låter oss härleda en ny klass (underklass) från en befintlig klass (superklass). Underklassen ärver superklassens attribut och metoder.
Om samma metod nu definieras i både superklassen och underklassen, åsidosätter metoden för underklassklassen metoden för superklassen. Detta är känt som metodöverstyrande.
Exempel 1: Metodöverskridande
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(); ) )
Utgång :
Jag är en hund.
I ovanstående program finns displayInfo()
metoden både i djurklassen och underklassen Hund.
När vi ringer displayInfo()
med d1-objektet (objekt av underklassen) kallas metoden inuti underklassen Dog. Den displayInfo()
metod för underklassen åsidosätter samma metod för superklassen.
Lägg märke till användningen av @Override
anteckningen i vårt exempel. I Java är annoteringar metadata som vi använde för att ge information till kompilatorn. Här @Override
anger anteckningen kompilatorn att metoden efter den här anteckningen åsidosätter superklassens metod.
Det är inte obligatoriskt att använda @Override
. Men när vi använder detta bör metoden följa alla regler för åsidosättande. I annat fall genererar kompilatorn ett fel.
Java-åsidosättande regler
- Både superklassen och underklassen måste ha samma metodnamn, samma returtyp och samma parameterlista.
- Vi kan inte åsidosätta metoden som deklareras som
final
ochstatic
. - Vi bör alltid åsidosätta superklassens abstrakta metoder (kommer att diskuteras i senare handledning).
super Keyword i Java Overriding
En vanlig fråga som uppstår när du utför åsidosättande i Java är:
Kan vi komma åt superklassens metod efter åsidosättande?
Svaret är ja . För att komma åt metoden för superklassen från underklassen använder vi super
nyckelordet.
Exempel 2: Användning av super Keyword
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(); ) )
Utgång :
Jag är ett djur. Jag är en hund.
I exemplet ovan åsidosätter underklassen Dog metoden displayInfo()
för superklassen Animal.
När vi kallar metoden med displayInfo()
hjälp av d1-objektet i Dog-underklassen kallas metoden inuti Dog-underklassen; metoden inuti superklassen kallas inte.
Inuti displayInfo()
Dog-underklassen har vi brukat super.displayInfo()
kalla displayInfo()
superklassen.
Det är viktigt att notera att konstruktörer i Java inte ärvs. Därför finns det inget sådant som konstruktörsöverstyrning i Java.
Vi kan dock kalla superklassens konstruktör från dess underklasser. För det använder vi super()
. För att lära dig mer, besök Java super nyckelord.
Åtkomstspecifikatorer i metodöverskridande
Samma metod som deklarerats i superklassen och dess underklasser kan ha olika åtkomstspecifikationer. Det finns dock en begränsning.
Vi kan bara använda de åtkomstspecifikatorer i underklasser som ger större åtkomst än superklassens åtkomstspecifikator. Till exempel,
Antag att en metod myClass()
i superklassen förklaras protected
. Då kan samma metod myClass()
i underklassen vara antingen public
eller protected
, men inte private
.
Exempel 3: Access Specifier i Overriding
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(); ) )
Utgång :
Jag är en hund.
I exemplet ovan åsidosätter underklassen Dog metoden displayInfo()
för superklassen Animal.
Närhelst vi ringer displayInfo()
med d1 (objekt av underklassen) kallas metoden inuti underklassen.
Lägg märke till att displayInfo()
deklareras protected
i Superklassen för djur. Samma metod har public
åtkomstspecifikatorn i underklassen Hund. Detta är möjligt eftersom det public
ger större åtkomst än protected
.
Åsidosättande abstrakta metoder
I Java skapas abstrakta klasser för att vara superklassen för andra klasser. Och om en klass innehåller en abstrakt metod är det obligatoriskt att åsidosätta den.
Vi lär oss mer om abstrakta klasser och åsidosättande av abstrakta metoder i senare handledning.