java override method overriding
Denna handledning förklarar hur man uppnår Runtime Polymorphism i Java med Method Overriding och @override-anteckningar med enkla exempel:
Vi har redan diskuterat polymorfismkonceptet och sammanställningstidspolymorfism i detalj. I denna handledning kommer vi att fortsätta med Runtime-polymorfism i Java.
Till skillnad från sammanställningstidspolymorfism där metodanrop löses vid sammanställningstid, löses metodanropet vid körning vid körningspolymorfism.
=> Kontrollera ALLA Java-handledning här.
Vad du kommer att lära dig:
- Runtime polymorfism i Java
- @override Anmärkning i Java
- Överbelastning och överstyrning i Java
- Slutsats
Runtime polymorfism i Java
En runtime polymorfism som också är känd som dynamisk polymorfism eller Leverans av dynamisk metod är en teknik där ett åsidosatt metodanrop löses dynamiskt vid körning.
Runtime-polymorfism i Java uppnås genom att använda “ metod som åsidosätter ”. Metodöverstyrning är en teknik genom vilken en metod i föräldraklassen omdefinieras eller åsidosätts i barnklassen.
När metoden åsidosätts i en klass, löser den dynamiska metodens avsändningsteknik det åsidosatta metodanropet vid körning och inte vid sammanställningstid.
Uppnå Runtime Polymorphism In Java - Method Overriding
Metodöverstyrning är det tillvägagångssätt som vi använder för att uppnå runtime polymorfism i Java. Som redan nämnts är metodöverstyrning en teknik där underklass lägger till en metod som redan finns i sin överordnade klass och lägger till ny funktionalitet till denna metod. Sedan säger vi att basklassmetoden är åsidosatt.
Den nya metoden som vi definierade i underklassen med samma prototyp som metoden för moderklassen men annan implementering kallas ” övergripande metod ” . Metoden i föräldraklassen är känd som ” Överstyrd metod ”.
vad man ska öppna bin-filer med
När metoden har åsidosatts kvarstår frågan hur samtalet till den här åsidosatta metoden löses?
Vi kallar vanligtvis den åsidosatta metoden genom basklassens referens. Vi skapar en referens för typbas och tilldelar sedan ett underordnat klassobjekt med det nya nyckelordet.
Således beror det på innehållet i referensvariabeln eller vilket objekt som refereras till av basklassreferensen som avgör vilken metod som ska kallas. Så om referensobjekten pekar på objektet i underklassen kallas den övergripande metoden.
Annars, om referensobjektet innehåller ett basklassobjekt kallas den åsidosatta metoden. Ett ämne som vi behöver vara tydliga i polymorfism under körning, särskilt för dynamisk metodutskick, är 'Upcasting' som förklaras nedan.
Upcasting
När ett referensobjekt från den överordnade klassen som vi diskuterade ovan pekar på eller hänvisar till objektet i underklassen, kallar vi det Upcasting.
Låt oss förstå upcasting med ett enkelt exempel.
Tänk på att vi har en klass 'BaseClass' och vi utökar denna BaseClass för att skapa en ny klass DerivedClass. Denna struktur ser ut som visas nedan.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
För att implementera upcasting kommer vi att förklara en referensvariabel av typen BaseClass. Därefter tilldelar vi ett objekt av DerivedClass till referensen för klass BaseClass som gjort i nedanstående koduttalande.
BaseClass base = new DerivedClass (); //Upcasting
Så här kan vi säga att vi har kastat bort DerivedClass-objektet till BaseClass. När det gäller polymorfism under körning är begreppet uppkastning mycket viktigt.
Således är upcasting i allmänhet processen att tilldela barn- eller underklassobjekt till referensen för en förälder eller superklass.
SuperClass reference = new Subclass Object;
Java-programmet nedan visar metodöverstyrning och visar också hur uppkastning utförs för att lösa åsidosatta metodanrop vid körning.
//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 ovanstående program har vi två klasser, dvs. barn1 och barn2, som båda härrör från en klass 'Förälder'. Föräldraklassen har en metod 'Print' som åsidosätts i både child1- och child2-klasser. Sedan i huvudmetoden skapar vi ett referensobjekt för föräldraklassen med namnet 'förälder'.
Först tilldelar vi det ett objekt från föräldraklassen och kallar sedan metoden “Skriv ut ()”. Sedan upprepar vi detta genom att tilldela först child1-objektet och sedan child2-objektet till föräldrarreferensen.
IP-adressklasser och nätmask
Utgången visar, beroende på innehållet i den överordnade referensen, och lämplig utskriftsmetod anropas.
Fördelar med dynamisk / körtidspolymorfism
- Med dynamisk polymorfism får programmeraren åsidosätta metoder.
- Det tillåter klasser att definiera en metod med allmän implementering som dess derivat sedan kan åsidosätta och tillhandahålla den specifika implementeringen.
- Med dynamisk metodutsändning löses metodanropet vid körning, till skillnad från överbelastning som bestäms vid kompileringstid. Detta möjliggör mer flexibilitet för programmerarna.
Eftersom polymorfism under körning binder lämplig metod till samtalet vid körning och vi kallar det också dynamisk bindning eller sen bindning . Sammanställningstids polymorfism å andra sidan stöder statisk bindning eller tidig bindning .
Statisk kontra dynamisk bindning
Statisk bindning | Dynamisk bindning |
---|---|
Metodsamtal löst vid kompilering är statisk bindande. | Metodsamtal löst vid körning är dynamisk bindning. |
Metodöverbelastning är ett exempel på statisk bindning. | Metodöverstyrning är ett exempel på dynamisk bindning. |
Klass- och fälttyper används för statisk bindning. | Objekt används för dynamisk bindning. |
Privata, slutliga och statiska enheter använder statisk bindning. | Virtuella metoder använder dynamisk bindning. |
Virtuell funktion / metod i Java
Virtuell funktion eller metod i Java är en funktion som används med Runtime-polymorfism. Till skillnad från C ++, Java har inget speciellt 'virtuellt' nyckelord för att beteckna att en metod är virtuell. En metod som definieras i basklassen och åsidosätts i den härledda klassen är virtuell.
I Java är varje icke-statisk metod som standard utom privat och slutlig en virtuell funktion. Så notera att metoderna vi diskuterade ovan för att implementera runtime polymorfism också är virtuella metoder.
Eftersom den statiska metoden är bunden till klass och inte kan anropas med hjälp av ett objekt, kan den inte användas med runtime polymorfism och det är inte heller en virtuell funktion.
Gränssnitt i Java är som standard virtuella. Klasser som implementerar gränssnitt ger implementeringar för gränssnittsmetoderna. Precis som i runtime-polymorfism löses även call to interface-metoder vid runtime.
Kom ihåg att eftersom metoder i ett gränssnitt är utformade för att åsidosättas, så är alla gränssnittsmetoder virtuella funktioner.
Tänk till exempel på följande kod:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
I ovanstående kod är metoden accelerate () en virtuell funktion eftersom den är en del av gränssnittsbilen och är utformad för att åsidosättas.
@override Anmärkning i Java
@Override-anteckningen är standardanteckningen i Java. Denna kommentar introducerades i Java 1.5. Anmärkningen @override används när underklassmetoden åsidosätter sin superklassmetod.
Genom att använda Java @override-anteckningen för att indikera att metoden åsidosätter sin överordnade klassmetod, skickar en kompilator en varning om den kommenterade metoden inte åsidosätts. Så gör det obligatoriskt för metoden att åsidosättas när @override-anteckningen används.
För det andra, genom att använda @override-anteckningen gör vi koden mer läsbar. Vi kan genast inse att metoden som deklareras ska åsidosättas.
Den allmänna syntaxen för Java @override-anteckningen är
public @interface override
Nedanstående Java-program visar användningen av @override-anteckningen.
//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 ovanstående program har vi en BaseClass som definierar en visningsmetod. Sedan härleder vi en klass DerivedClass från denna BaseClass och markerar visningsmetoden med @override-anteckningen. Denna metod åsidosätts i DerivedClass.
I huvudmetoden skapar vi en BaseClass-objektreferens och pekar den till DerivedClass-objektet som gör att referensen kallar DerivedClass-visningsmetoden.
Om vi inte hade implementerat display () -metoden i klassen Derived, skulle kompilatorn ha gett en kompilatorvarning eftersom den är markerad med @override-kommentar.
Överbelastning och överstyrning i Java
Nu när vi har diskuterat både överbelastning och åsidosättande i Java, låt oss sammanfatta dessa två begrepp.
Överbelastning är relaterad till sammanställningstidspolymorfism, dvs. vi implementerar sammanställningstidpolymorfism med hjälp av överbelastning. Överbelastning sker på två sätt, dvs. metodöverbelastning och överbelastning av operatören.
Metodöverbelastning är den teknik där vi har mer än en metod med samma namn men olika parameterlistor. Parameterlistan är differentierad baserat på antalet parametrar, parametertyper eller parametrar.
Överbelastning av operatörer i Java är begränsad och det tillåter oss att endast överbelasta operatören '+' som används för att lägga till två nummer och sammanfoga två strängobjekt.
Överbelastning löses vid sammanställningstid och är statisk. Det kallas också 'Tidig bindning' .
Metodöverskridande är en funktion som vi implementerar polymorfism för körning. I metodöverstyrning åsidosätts en metod för föräldraklassen i barnklassen. Detta betyder att metodprototypen i både super- och underklass förblir densamma men implementeringarna är olika.
Metodöverstyrning använder den dynamiska metodens utsändningsteknik för att lösa metodanropet och bestämma om en superklass- eller underklassmetod ska anropas och detta görs vid körning.
Därför kallas polymorfism även dynamisk polymorfism eller sen bindning.
Låt oss sedan tabellisera skillnaderna mellan överbelastning och åsidosättande i Java.
Överbelastning mot överstyrning i Java
Överbelastning | Åsidosättande |
---|---|
Överbelastning används vid sammanställningstidspolymorfism. | Åsidosättande genomförs i polymorfism under körning. |
Kan göras i samma klass. Kan kräva arv eller kanske inte. | Åsidosättande kräver alltid arv. |
Metoder är överbelastade med samma metodnamn och annan parameterlista. | Överskridna metoder har samma prototyper. |
Returtypen beaktas inte vid metodöverbelastning. | Returtypen ska vara densamma i metoder som åsidosätts och åsidosätts. |
Förbättrar läsbarheten i programmet. | Åsidosättande gör det möjligt att ha specifik implementering klassvis. |
Vanliga frågor
F # 1) Kan vi åsidosätta den statiska metoden?
Svar: Nej. Statiska metoder kan inte åsidosättas i Java. Detta beror på att statiska metoder är klassbaserade och kallas direkt av klass. De behöver inte objekt för att åberopa vid körning. Därför bestäms utsändningen av den statiska metoden av kompilatorn.
F # 2) Kan vi åsidosätta konstruktören?
Svar: Nej, vi kan inte åsidosätta en konstruktör. En konstruktör anropas när objektet skapas. Det kallas inte ett objekt. Ett av kraven för åsidosättande är också den åsidosatta metoden och den åsidosättande metoden bör ha samma metodsignatur som inte är möjligt för konstruktörer.
F # 3) Varför kallas metodöverstyrning som dynamisk polymorfism?
Svar: Vid metodöverstyrning löses metodanropet dynamiskt vid körning. Därför kallas det dynamisk polymorfism.
F # 4) Vad är användningen av dynamisk polymorfism i Java?
Svar: Dynamisk polymorfism använder en dynamisk metod för utsändning av metoder som stöder metodöverstyrning så att underklassen kan ge specifik implementering av den åsidosatta metoden. På så sätt kan vi implementera de specifika funktionerna som gör att vi kan skriva effektiva program.
För det andra behöver vi inte heller oroa oss för att lösa metodanrop eftersom dynamisk metodutskick bestämmer vilken metod vi ska ringa.
F # 5) Vad är skillnaden mellan statisk och dynamisk bindning?
Svar: Länken mellan ett metodanrop och dess implementering kallas bindande. När denna länkning löses vid sammanställningstid kallar vi det som statisk bindning. När bindningen görs dynamiskt vid körning, kallar vi det som dynamisk bindning.
Java vilsam webbtjänst intervju frågor
Den statiska bindningen använder datatypen för klass och fält för att lösa metodanrop. Den dynamiska bindningen använder objekt för att lösa metodanrop. Statisk bindning kallas också polymorfism för kompileringstid och dynamisk bindning kallas också polymorfism för runtime.
Slutsats
I denna handledning har vi diskuterat runtime polymorfism i Java i detalj.
Runtime polymorfism implementeras med metodöverstyrning. Metodöverstyrning görs i underklassen där en metod som definieras i superklassen omdefinieras eller åsidosätts i dess underklass. Metodesignaturen förblir densamma i super- och underklassen.
Genom att använda metodöverstyrning kan vi tillhandahålla specifik implementering av samma metod i underklassen. På så sätt kan vi skriva effektivare program som involverar arv. Java tillhandahåller @override-anteckningar för att indikera att metoden ska åsidosättas.
Som standard är alla icke-statiska metoder som inte är slutgiltiga virtuella i Java. Alla virtuella metoder kan åsidosättas.
=> Se upp den enkla Java-träningsserien här.
Rekommenderad läsning
- Åsidosätta fördefinierade metoder i Java
- Java Stränglängd () Metod med exempel
- Vad är polymorfism i Java - Handledning med exempel
- Hur använder jag Java toString-metoden?
- Java-strängindex Om metod med kodexempel
- Java String innehåller () Metodhandledning med exempel
- Java String Split () Metod - Hur man delar upp en sträng i Java
- Java-sträng jämför med metod med programmeringsexempel