java override method overriding
Denne vejledning forklarer, hvordan man opnår Runtime Polymorphism i Java ved hjælp af Method Overriding og @override-kommentar med enkle eksempler:
Vi har allerede diskuteret polymorfisme-konceptet og kompileringstidspolymorfisme i detaljer. I denne vejledning vil vi gå videre med Runtime polymorfisme i Java.
I modsætning til kompileringstidspolymorfisme, hvor metodeopkald løses ved kompileringstidspunkt, løses metodeopkaldet ved kørselstid i løbetidspolymorfisme.
=> Tjek ALLE Java-tutorials her.
Hvad du vil lære:
- Runtime polymorfisme i Java
- @override-kommentar i Java
- Overbelastning og overstyring i Java
- Konklusion
Runtime polymorfisme i Java
En runtime polymorfisme, der også er kendt som dynamisk polymorfisme eller Udsendelse af dynamisk metode er en teknik, hvor et tilsidesat metodekald løses dynamisk ved kørsel.
Runtime polymorfisme i Java opnås ved hjælp af “ metode tilsidesættelse ”. Metodeoverstyring er en teknik, hvormed en metode i forældreklassen omdefineres eller tilsidesættes i barneklassen.
Når metoden tilsidesættes i en klasse, løser den dynamiske metodeudsendelsesteknik det tilsidesatte metodeopkald ved kørselstid og ikke på kompileringstidspunktet.
Opnå Runtime polymorfisme i Java - metode tilsidesættelse
Metodeoverstyring er den tilgang, vi bruger til at opnå runtime polymorfisme i Java. Som allerede nævnt er metodeoverstyring en teknik, hvor underklasse tilføjer en metode, der allerede er til stede i sin overordnede klasse og tilføjer ny funktionalitet til denne metode. Så siger vi, at baseklassemetoden er tilsidesat.
Den nye metode, vi definerede i underklassen med den samme prototype som metoden til moderklassen, men anden implementering kaldes ' overordnet metode ” . Metoden i overordnet klasse er kendt som “ Tilsidesat metode ”.
hvilket etl-værktøj er bedst på markedet
Når metoden først er tilsidesat, forbliver spørgsmålet, hvordan opkaldet til denne tilsidesatte metode løses?
Vi kalder normalt den tilsidesatte metode gennem basisklassens reference. Vi opretter en reference til typebase og tildeler derefter et underordnet klasseobjekt ved hjælp af det nye nøgleord.
Således afhænger det af indholdet af referencevariablen, eller hvilket objekt der refereres til ved hjælp af basisklassereferencen, der bestemmer, hvilken metode der skal kaldes. Så hvis referenceobjekterne peger på objektet i underklassen, kaldes den overordnede metode.
Ellers kaldes den tilsidesatte metode, hvis referenceobjektet indeholder et basisklasseobjekt. Et emne, vi skal have klar i runtime polymorfisme, især for udsendelse af dynamisk metode, er 'Upcasting', som forklares nedenfor.
Upcasting
Når et referenceobjekt fra den overordnede klasse, som vi diskuterede ovenfor, peger på eller henviser til objektet i underklassen, kalder vi det Upcasting.
Lad os forstå upcasting ved hjælp af et simpelt eksempel.
Overvej at vi har en klasse 'BaseClass', og vi udvider denne BaseClass til at oprette en ny klasse DerivedClass. Denne struktur ser ud som vist nedenfor.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
For at implementere upcasting vil vi nu erklære en referencevariabel af typen BaseClass. Derefter tildeler vi et objekt fra DerivedClass til referencen til klasse BaseClass som gjort i nedenstående kodeudtalelse.
BaseClass base = new DerivedClass (); //Upcasting
Så her kan vi sige, at vi har udsendt DerivedClass-objektet til BaseClass. For så vidt angår runtime polymorfisme er begrebet upcasting meget vigtigt.
Generelt er upcasting således processen med at tildele underordnede eller underklasseobjekter til en forælders eller superklasses reference.
SuperClass reference = new Subclass Object;
Java-programmet nedenfor viser metodeoverstyring og viser også, hvordan upcasting udføres for at løse tilsidesatte metodeopkald ved kørsel.
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String() args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
Produktion:
I ovenstående program har vi to klasser, dvs. barn1 og barn2, som begge er afledt af en 'Forældre' klasse. Forældreklassen har en metode 'Print', som tilsidesættes i både child1 og child2 klasser. Derefter opretter vi i hovedmetoden et referenceobjekt til forældreklassen ved navn 'forælder'.
Først tildeler vi det et objekt fra forældreklassen og kalder derefter metoden “Udskriv ()”. Derefter gentager vi dette ved først at tildele child1-objektet og derefter child2-objektet til forældreferencen.
hvordan man åbner en torrentfil på Windows 10
Outputtet viser, afhængigt af indholdet af den overordnede reference, og den relevante udskrivningsmetode kaldes.
Fordele ved dynamisk / kørselstid polymorfisme
- Med dynamisk polymorfisme har programmøren lov til at tilsidesætte metoder.
- Det giver klasser mulighed for at definere en metode med generel implementering, som dens derivater derefter kan tilsidesætte og give den specifikke implementering.
- Ved afsendelse af dynamisk metode løses metodeopkaldet ved kørsel, i modsætning til overbelastning, der besluttes på kompileringstidspunktet. Dette giver mere fleksibilitet for programmørerne.
Da runtime polymorfisme binder den passende metode til opkaldet ved kørselstid, og vi kalder det også dynamisk binding eller sen binding . Kompileringstidspolymorfisme understøtter på den anden side statisk binding eller tidlig binding .
Statisk vs. dynamisk binding
Statisk binding | Dynamisk binding |
---|---|
Metodeopkald løst ved kompileringstidspunktet er statisk bindende. | Metodeopkald løst ved kørsel er dynamisk binding. |
Metodeoverbelastning er et eksempel på statisk binding. | Metodeoverstyring er et eksempel på dynamisk binding. |
Klasse- og felttyper bruges til statisk binding. | Objekter bruges til dynamisk binding. |
Private, endelige og statiske enheder bruger statisk binding. | Virtuelle metoder bruger dynamisk binding. |
Virtuel funktion / metode i Java
Virtuel funktion eller metode i Java er en funktion, der bruges med Runtime polymorfisme. I modsætning til C ++, Java har ikke et specielt 'virtuelt' nøgleord at betegne, at en metode er virtuel. En metode, der er defineret i basisklassen og tilsidesat i den afledte klasse, er virtuel.
I Java er som standard enhver ikke-statisk metode undtagen privat og endelig en virtuel funktion. Så bemærk, at de metoder, vi diskuterede ovenfor, for at implementere polymorfisme til runtime, også er virtuelle metoder.
Da den statiske metode er bundet til klasse og ikke kan kaldes til ved hjælp af et objekt, kan den ikke bruges med runtime polymorfisme, og det er heller ikke en virtuel funktion.
Grænseflader i Java er som standard virtuelle. Klasser, der implementerer grænseflader, giver implementeringer af grænseflademetoderne. Som i runtime polymorfisme løses call to interface-metoder også ved runtime.
Husk, at da metoder i en grænseflade er designet til at blive tilsidesat, er alle grænseflademetoder virtuelle funktioner.
Overvej f.eks. Følgende kode:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
I ovenstående kode er metoden accelerate () en virtuel funktion, da den er en del af interfacebilen og er designet til at blive tilsidesat.
@override-kommentar i Java
@Override-kommentaren er standardkommentaren i Java. Denne kommentar blev introduceret i Java 1.5. @Override-kommentaren bruges, når underklassemetoden tilsidesætter sin superklassemetode.
Ved at bruge Java @override-kommentar til at indikere, at metoden tilsidesætter dens overordnede klassemetode, udsender en kompilator en advarsel, hvis den kommenterede metode ikke tilsidesættes. Så det er obligatorisk, at metoden tilsidesættes, når @override-kommentaren bruges.
For det andet gør vi koden mere læselig ved at bruge @override-kommentaren. Vi kan straks indse, at metoden, der erklæres, skal tilsidesættes.
Den generelle syntaks for Java @override-kommentar er
public @interface override
Nedenstående Java-program viser brugen af @override-kommentar.
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args()) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
Produktion:
I ovenstående program har vi en BaseClass, der definerer en visningsmetode. Derefter udleder vi en klasse DerivedClass fra denne BaseClass og markerer visningsmetoden med @override-kommentaren. Denne metode tilsidesættes i DerivedClass.
I hovedmetoden opretter vi en BaseClass-objektreference og peger den på DerivedClass-objektet, som får referencen til at kalde DerivedClass-visningsmetoden.
Hvis vi ikke havde implementeret display () -metoden i klassen Derived, ville compileren have givet en compiler-advarsel, da den er markeret med @override-kommentar.
Overbelastning og overstyring i Java
Nu hvor vi har diskuteret både overbelastning og tilsidesættelse i Java, lad os sammenfatte disse to begreber.
Overbelastning er relateret til kompileringstidspolymorfisme, dvs. vi implementerer kompileringstidspolymorfisme ved hjælp af overbelastning. Overbelastning sker på to måder, dvs. metodeoverbelastning og operatøroverbelastning.
Metodeoverbelastning er den teknik, hvor vi har mere end en metode med samme navn, men forskellige parameterlister. Parameterlisten er differentieret baseret på antallet af parametre, parametertyper eller rækkefølgen af parametre.
hvordan man opretter en falsk e-mail-adresse
Operatøroverbelastning i Java er begrænset, og det giver os mulighed for kun at overbelaste '+' operatøren, der bruges til at tilføje to tal og sammenkæde to strengobjekter.
Overbelastning løses ved kompileringstidspunktet og er statisk. Det kaldes også 'Tidlig binding' .
Metodeoverstyring er en funktion, hvor vi implementerer runtime polymorfisme. Ved metodeoverstyring tilsidesættes en metode fra overordnet klasse i underordnet klasse. Dette betyder, at metode prototypen i både super og underklasse forbliver den samme, men implementeringerne er forskellige.
Metodeoverstyring bruger den dynamiske metodeudsendelsesteknik til at løse metodekaldet og beslutte, om der skal kaldes en superklasse- eller underklassemetode, og dette gøres ved kørsel.
Derfor kaldes polymorfisme til runtime også dynamisk polymorfisme eller sen binding.
Lad os derefter tabulere forskellene mellem overbelastning og tilsidesættelse i Java.
Overbelastning mod overstyring i Java
Overbelastning | Tilsidesættelse |
---|---|
Overbelastning bruges i polymorfisme til kompileringstid. | Overstyring implementeres i runtime polymorfisme. |
Kan udføres i samme klasse. Kan kræve arv eller måske ikke. | Tilsidesættelse kræver altid arv. |
Metoder er overbelastet med samme metode navn og anden parameterliste. | Tilsidesatte metoder har de samme prototyper. |
Returtypen betragtes ikke ved metodeoverbelastning. | Returtype skal være den samme i tilsidesatte og tilsidesættende metoder. |
Forbedrer læsbarheden af programmet. | Tilsidesættelse giver mulighed for at have specifik implementering klassevis. |
Ofte stillede spørgsmål
Q # 1) Kan vi tilsidesætte den statiske metode?
Svar: Nej. Statiske metoder kan ikke tilsidesættes i Java. Dette skyldes, at statiske metoder er klassebaserede og kaldes direkte af klassen. De har ikke brug for objekter til at påberåbe sig under kørsel. Derfor bestemmes udsendelsen af den statiske metode af kompilatoren.
Q # 2) Kan vi tilsidesætte konstruktøren?
Svar: Nej, vi kan ikke tilsidesætte en konstruktør. En konstruktør kaldes, når objektet oprettes. Det kaldes ikke et objekt. Et af kravene til tilsidesættelse er også den tilsidesatte metode, og den overordnede metode skal have den samme metodesignatur, som ikke er mulig i tilfælde af konstruktører.
Spørgsmål nr. 3) Hvorfor kaldes metodeoverstyring som dynamisk polymorfisme?
Svar: I tilfælde af metodeoverstyring løses metodeopkaldet dynamisk ved kørsel. Derfor kaldes det dynamisk polymorfisme.
Spørgsmål nr. 4) Hvad er brugen af dynamisk polymorfisme i Java?
Svar: Dynamisk polymorfisme bruger en teknik til afsendelse af dynamisk metode, der understøtter tilsidesættelse af metoden, så underklassen kan give specifik implementering af den tilsidesatte metode. På denne måde kan vi implementere de specifikke funktioner, der giver os mulighed for at skrive effektive programmer.
For det andet behøver vi heller ikke bekymre os om at løse metodeopkald, da afsendelse af dynamisk metode bestemmer, hvilken metode vi skal ringe til.
Q # 5) Hvad er forskellen mellem statisk og dynamisk binding?
Svar: Forbindelsen mellem et metodekald og dets implementering kaldes bindende. Når denne sammenkædning løses ved kompileringstid, kalder vi det som statisk binding. Når bindingen udføres dynamisk ved kørselstid, kalder vi det som dynamisk binding.
Den statiske binding bruger datatypen klasse og felter til at løse metodekald. Den dynamiske binding bruger objekter til at løse metodekald. Statisk binding kaldes også polymorfisme til kompileringstid, og dynamisk binding kaldes også polymorfisme til runtime.
Konklusion
I denne vejledning har vi diskuteret runtime polymorfisme i Java detaljeret.
Runtime polymorfisme implementeres ved hjælp af metode tilsidesættelse. Metodeoverstyring udføres i underklassen, hvor en metode, der er defineret i superklassen, omdefineres eller tilsidesættes i dens underklasse. Metodesignaturen forbliver den samme i super- og underklassen.
Ved at bruge metodeoverstyring kan vi levere specifik implementering til den samme metode i underklassen. På denne måde kan vi skrive mere effektive programmer, der involverer arv. Java giver @override-kommentar for at indikere, at metoden skal tilsidesættes.
Som standard er alle ikke-statiske metoder, der ikke er endelige, virtuelle i Java. Alle virtuelle metoder kan tilsidesættes.
=> Hold øje med den enkle Java-træningsserie her.
Anbefalet læsning
- Tilsidesættelse af foruddefinerede metoder i Java
- Java strenglængde () Metode med eksempler
- Hvad er polymorfisme i Java - vejledning med eksempler
- Sådan bruges Java toString-metoden?
- Java-strengindeks Af metode med kodeeksempler
- Java String indeholder () Metodevejledning med eksempler
- Java String Split () Metode - Sådan opdeles en streng i Java
- Java-streng sammenlignet med metode med programmeringseksempler